• 检查或复位状态[ feof()函数、ferror()函数和clearerr()函数 ]


    调用 fread()读取数据时,如果返回值小于参数 nmemb 所指定的值,表示发生了错误或者已经到了文件
    末尾(文件结束 end-of-file),但 fread()无法具体确定是哪一种情况;在这种情况下,可以通过判断错误标志或 end-of-file 标志来确定具体的情况。

    1. feof()函数

    库函数 feof()用于测试参数 stream 所指文件的 end-of-file 标志,如果 end-of-file 标志被设置了,则调用feof()函数将返回一个非零值,如果 end-of-file 标志没有被设置,则返回 0。
    其函数原型如下所示:

    #include 
    int feof(FILE *stream);
    
    • 1
    • 2

    当文件的读写位置移动到了文件末尾时,end-of-file 标志将会被设置。

    if (feof(file)) 
    {
    	/* 到达文件末尾 */
    }
    else 
    {
    	/* 未到达文件末尾 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. ferror()函数

    库函数 ferror()用于测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0。
    其函数原型如下所示:

    #include 
    int ferror(FILE *stream);
    
    • 1
    • 2

    当对文件的 I/O 操作发生错误时,错误标志将会被设置。

    if (ferror(file)) 
    {
    	/* 发生错误 */
    }
    else 
    {
    	/* 未发生错误 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. clearerr()函数

    库函数 clearerr()用于清除 end-of-file 标志和错误标志,当调用 feof()或 ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。
    clearerr()函数原型如下所示:

    #include 
    void clearerr(FILE *stream);
    
    • 1
    • 2

    此函数没有返回值,调用将总是会成功!
    对于 end-of-file 标志,除了使用 clearerr()显式清除之外,当调用 fseek()成功时也会清除文件的 end-of-file 标志。

    clearerr()函数使用示例

    #include 
    #include 
    
    int main(void) 
    {
    	 FILE *fp = NULL;
    	 char buf[20] = {0};
    	 
    	 /* 打开文件 */
    	 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 (10 > fread(buf, 1, 10, fp)) 
    	 {
    		 if (feof(fp))
    		 printf("end-of-file 标志被设置,已到文件末尾!\n");
    		 clearerr(fp); //清除标志
    	 }
    	 
    	 /* 关闭文件 */
    	 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
  • 相关阅读:
    统计目录下的文件数量
    web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站
    VUE之Vxe-table动态生成多级表头及后端返回数据的处理
    一张图看懂 SQL 的各种 join 用法!
    ZigBee技术与实训教程(无线传感器网络笔记第三次)
    算法——双指针
    Norgen AAV提取剂盒说明书(含特色)
    时间复杂度与空间复杂度
    PDF压缩文件怎么压缩?两分钟让你学会三种方法
    基于NXP iMX8测试Secure Boot功能部署
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/126554561