在读写文件时,犯什么错误。这是很常见的,今天咱们就来看看C语言是如何处理这些文件读写错误的。
int feof ( FILE * stream );
这个API的作用是检查文件的EOF(end-of-file)指示符是否有效。如果,返回值是一个非零值,则EOF有效。
这个EOF指示符的有效,通常是由于前一次操作访问了文件末尾或者更往后的内存空间。
这里有一点需要注意,虽然文件的读写指针可能已经指向了文件末尾,但是,只要用户不去访问它,EOF指示符就是无效的。
EOF指示符可以被clearerr, rewind, fseek, fsetpos, freopen这些API清楚。当下一次访问出错时,EOF会被自动设置为有效。
int ferror ( FILE * stream );
这个API的作用是检查stream的错误指示符是否有效,如果有效,就返回一个非零的返回值。
错误指示符通常是由于上一次文件错做失败而导致被设置成有效的。
通过调用 clearerr, rewind, freopen就可以将其无效化。
void clearerr ( FILE * stream );
这个API的作用是将 EOF指示符 和 错误指示符 无效化。
当然了,上面也提到了,rewind, fseek, fsetpos, freopen也有可以做到同样的事情。
void perror ( const char * str );
这个API可以打印错误信息。过程就是,先把解析errno,生成一个描述信息字符串,然后再把参数中的字符串接在后面,生成一条完整的错误信息字符串,并输出到stderr中。
errno其实是一个整形变量,它的值代表了错误发生的条件和一些诊断信息。不同的编译器和操作系统对它的值的定义会有少许的不同,大家可以参考对应的文档。但是,一些比较小的值,在不同环境下,还是可以通用的,比如1~20.
perror应该在错误发生后,立刻被调用,不然的话,有可能被后续发生的错误覆盖。
示例代码
#include int main (){ FILE * pFile; pFile=fopen ("unexist.ent","rb"); if (pFile==NULL) perror ("The following error occurred"); else fclose (pFile); return 0;}
#include int main (){ FILE * pFile; pFile = fopen("myfile.txt","r"); if (pFile==NULL) perror ("Error opening file"); else { fputc ('x',pFile); if (ferror (pFile)) { printf ("Error Writing to myfile.txt"); clearerr (pFile); } fgetc (pFile); if (!ferror (pFile)) printf ("No errors reading myfile.txt"); fclose (pFile); } return 0;}
#include int main (){ FILE * pFile; int n = 0; pFile = fopen ("myfile.txt","rb"); if (pFile==NULL) perror ("Error opening file"); else { while (fgetc(pFile) != EOF) { ++n; } if (feof(pFile)) { puts ("End-of-File reached."); printf ("Total number of bytes read: %d", n); } else puts ("End-of-File was not reached."); fclose (pFile); } return 0;}
这就是今天的内容,欢迎大家评论区讨论。
如果对大家有用的话,就请加转发+关注。