C语言文件操作函数之ferror & feof & clearerr

匿名 (未验证) 提交于 2019-12-03 00:43:02

这些函数都是和文件读写时发生错误有关,下面一一分析:

1:ferror

原型:int ferror(FILE * fp)

作用:测试一个文件流是否被设置了错误标识符,如果是返回非 0 整数,否则返回 0。

例子:

short ch; FILE * f1; f1 = fopen("test.txt", "w"); ch = fgetc(f1); //注意,我们以 只写 方式打开了文件,但是却尝试向该文件读取一个字符,肯定会操作失败,这时,该文件流就会被设置上错误标识符 printf("%d\n", ch); //这里输出 -1 ,因为当fgetc函数操作失败时返回 EOF,即 -1 if(ferror(f1)){      //用函数ferror测试文件流是否存在错误标识符       printf("Have a error.\n");      //结果自然是,所以输出错误信息 } fclose(f1);

注意:每次发生不同的操作错误都会更新文件流上次保存的错误标识符,例如:先后发生了A和B两个文件操作错误,并且A错误的标识符为16,B错误的标识符为32,那么文件流保存的错误标识符就是 32,用ferror(fp)读取返回的结果就是 32。

2:feof

原型:int feof(FILE * fp)

作用:测试一个文件流是否被设置了文件结束标识符,如果是返回非 0 整数,否则返回 0。

例子:

FILE * f1; short ch; f1 = fopen("utf8.txt", "r"); /* 此文件的十六进制结构为: 31 22 (共两个字节) */ while(1){     ch = getc(f1);         //在第三次循环执行getc语句时,由于文件指针已经指向了EOF,所以这次getc函数读取EOF值(-1)之后,如果指针再向后偏移一位,就发现不指向任何有效的位置了(这时指针不会发生偏移了),所以这时文件流会被设置上文件结束标识符     if (feof(f1)){         break;     }     printf("%x\n", ch); } fclose(f1); /* 输出: 31 22 Press any key to continue */

注意:feof函数检测文件是否结束的方法很诡异,它不是检测当前文件指针是否指向EOF位置,而是检测EOF是否已经被读取出来了,就像上面代码的第三次循环,这时getc把EOF位置读取出来了,然后发现指针不能再向后面移动了,所以才给文件流设置上文件结束的标识。

3:clearerr

原型:void clearerr(FILE * fp)

例子:

FILE * f1; short ch; f1 = fopen("utf8.txt", "r"); while(1){     ch = getc(f1);     if (feof(f1)){         break;     } } //上面循环结束之后,文件流已经被设置了文件结束标志 printf("%d\n", feof(f1)==0); //输出 0,说明feof返回非 0 值,即检测到文件已经到结束位置 clearerr(f1); //清除文件流结束标志和错误标志 printf("%d\n", feof(f1)==0); //输出 1,说明feof返回 0 值,即检测到文件没到结束位置,虽然实际上已经到结束位置了 fclose(f1);

注意:调用文件指针重置函数rewind(原型:void rewind(FILE * fp)),也会清除文件流的结束标志。

原文:https://www.cnblogs.com/ryzz/p/9362943.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!