• fseek()函数 和 ftell()函数


    一、fseek定位

    库函数 fseek()的作用类似于系统调用 lseek(),用于设置文件读写位置偏移量,lseek()用于文件 I/O,而库函数 fseek()则用于标准 I/O,其函数原型如下所示:

    #include 
    int fseek(FILE *stream, long offset, int whence);
    
    • 1
    • 2

    函数参数和返回值含义如下:
    stream:FILE 指针。
    offset:与 lseek()函数的 offset 参数意义相同。
    whence:与 lseek()函数的 whence 参数意义相同。
    返回值:成功返回 0;发生错误将返回-1,并且会设置 errno 以指示错误原因;与 lseek()函数的返回值

    调用库函数 fread()、fwrite()读写文件时,文件的读写位置偏移量会自动递增,使用 fseek()可手动设置
    文件当前的读写位置偏移量。

    譬如将文件的读写位置移动到文件开头处:

    fseek(file, 0, SEEK_SET);
    
    • 1

    将文件的读写位置移动到文件末尾:

    fseek(file, 0, SEEK_END);
    
    • 1

    将文件的读写位置移动到 100 个字节偏移量处:

    fseek(file, 100, SEEK_SET);
    
    • 1

    使用 fseek()调整文件读写位置

    #include 
    #include 
    
    int main(void) 
    {
    	 FILE *fp = NULL;
    	 char rd_buf[100] = {0};
    	 char wr_buf[] = "比特冬哥https://blog.csdn.net/Dustinthewine?spm=1010.2135.3001.5343";
    	 int ret;
    	 
    	 /* 打开文件 */
    	 if (NULL == (fp = fopen("./test_file", "w+"))) 
    	 {
    		 perror("fopen error");
    		 exit(-1);
    	 }
    	 printf("文件打开成功!\n");
    	 
    	 /* 写文件 */
    	 if (sizeof(wr_buf) >
    	 fwrite(wr_buf, 1, sizeof(wr_buf), fp)) 
    	 {
    		 printf("fwrite error\n");
    		 fclose(fp);
    		 exit(-1);
    	 }
    	 printf("数据写入成功!\n");
    	 
    	 /* 将读写位置移动到文件头部 */
    	 if (0 > fseek(fp, 0, SEEK_SET)) 
    	 {
    		 perror("fseek error");
    		 fclose(fp);
    		 exit(-1);
    	 }
    	 
    	 /* 读文件 */
    	 if (sizeof(wr_buf) >(ret = fread(rd_buf, 1, sizeof(wr_buf), fp))) 
    	 {
    		 printf("fread error\n");
    		 fclose(fp);
    		 exit(-1);
    	 }
    	 printf("成功读取%d 个字节数据: %s\n", ret, rd_buf);
    	 
    	 /* 关闭文件 */
    	 fclose(fp);
    	 exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    程序中首先调用 fopen()打开当前目录下的 test_file 文件,参数 mode 设置为"w+";接着调用 fwrite()将wr_buf 缓冲区中的字符串数据
    "比特冬哥https://blog.csdn.net/Dustinthewine?spm=1010.2135.3001.5343"写入到文件中;由于调用了fwrite(),所以此时的读写位置已经发生了改变,不再是文件头部,所以程序中调用了 fseek()将读写位置移动到了文件头,接着调用 fread()从文件头部开始读取刚写入的数据,读取成功之后打印出信息。

    二、ftell()函数

    库函数 ftell()可用于获取文件当前的读写位置偏移量,其函数原型如下所示:

    #include 
    long ftell(FILE *stream);
    
    • 1
    • 2

    参数 stream 指向对应的文件,函数调用成功将返回当前读写位置偏移量;调用失败将返回-1,并会设置errno 以指示错误原因。

    使用 fseek()和 ftell()函数获取文件大小

    #include 
    #include 
    
    int main(void) 
    {
    	 FILE *fp = NULL;
    	 int ret;
    	 
    	 /* 打开文件 */
    	 if (NULL == (fp = fopen("./testApp.c", "r"))) 
    	 {
    		 perror("fopen error");
    		 exit(-1);
    	 }
    	 printf("文件打开成功!\n");
    	 
    	 /* 将读写位置移动到文件末尾 */
    	 if (0 > fseek(fp, 0, SEEK_END)) 
    	 {
    		 perror("fseek error");
    		 fclose(fp);
    		 exit(-1);
    	 }
    	 
    	 /* 获取当前位置偏移量 */
    	 if (0 > (ret = ftell(fp))) 
    	 {
    		 perror("ftell error");
    		 fclose(fp);
    		 exit(-1);
    	 }
    	 printf("文件大小: %d 个字节\n", ret);
    	 
    	 /* 关闭文件 */
    	 fclose(fp);
    	 exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    首先打开当前目录下的 testApp.c 文件,将文件的读写位置移动到文件末尾,然后再获取当前的位置偏移量,也就得到了整个文件的大小。

  • 相关阅读:
    月是故乡明,每逢佳节倍思亲,近乡情更怯
    实操Java 诊断工具 Arthas
    前端菜鸟一般不知道css可以这样命名
    第4周学习:MobileNetV1, V2, V3
    Cadence Allegro 过孔通孔盲孔埋孔详细说明及设计举例图文教程
    计算机毕业设计ssm基于ssm的牧场管理系统6ui1j系统+程序+源码+lw+远程部署
    Jmeter——循环控制器中实现Counter计数器的次数重置
    初级数值计算理论总结
    数值优化:经典随机优化算法及其收敛性与复杂度分析
    高等数学(第七版)同济大学 习题3-8 个人解答
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/126554286