标签:style fopen col fgetc 不同的 先后 bre 信息 tin
这些函数都是和文件读写时发生错误有关,下面一一分析:
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)
作用: 清除一个文件流的文件结束和错误标识符(即把文件结束符和错误标识符从非 0 值变成 0 值)。
例子:
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)),也会清除文件流的结束标志。
C语言文件操作函数之ferror & feof & clearerr
标签:style fopen col fgetc 不同的 先后 bre 信息 tin
原文地址:https://www.cnblogs.com/ryzz/p/9362943.html