10.5 文件读写的出错检测
在进行文件操作时,出错是不可避免的。为了确保文件操作的可靠性,C 提供了一些函数用来检查输入输出函数调用时可能出现的错误。
1. ferror
函数
ferror
函数用来检查文件操作过程中是否发生了错误。它的一般调用形式为:
int ferror(FILE *stream);
如果 ferror
返回值为 0
(假),表示未出错;如果返回一个非零值,表示出错。需要注意的是,对同一个文件每一次调用输入输出函数,都会产生一个新的 ferror
函数值,因此,应当在调用一个输入输出函数后立即检查 ferror
函数的值,否则信息会丢失。
2. clearerr
函数
clearerr
函数的作用是清除文件的出错标志和文件结束标志。假设在调用一个输入输出函数时出现错误,ferror
函数值为一个非零值。应该立即调用 clearerr(fp)
,使 ferror(fp)
的值变成 0
,以便再进行下一次的检测。
void clearerr(FILE *stream);
只要出现文件读写出错标志,它就一直保留,直到对同一文件调用 clearerr
函数或 rewind
函数,或任何其他一个输入输出函数。
实例:检测文件读写错误
编写一个程序,从文件中读取数据并进行错误检测:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char ch;
if ((fp = fopen("example.txt", "r")) == NULL) {
printf("无法打开文件\n");
return 1;
}
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
if (ferror(fp)) { // 检查是否发生读取错误
printf("读取文件时出错\n");
clearerr(fp); // 清除错误标志
break;
}
}
fclose(fp);
return 0;
}
程序分析:
- 用
fopen
函数打开文件时,指定输入文件名为example.txt
。 - 使用
fgetc
函数从文件中逐字符读取数据,并使用putchar
函数将字符输出到屏幕上。 - 在每次读取后立即检查
ferror
函数的返回值,若发生错误,则输出错误信息并调用clearerr
函数清除错误标志。 - 关闭文件。
理解与应用
在实际编程中,文件操作的错误检测是非常重要的,尤其是在处理大量数据时。使用 ferror
和 clearerr
函数,可以确保文件操作的可靠性,避免因为未及时检测和处理错误而导致的数据丢失或程序崩溃。
小结
通过对 ferror
和 clearerr
函数的学习,我们可以实现对文件操作的错误检测和处理,从而提高程序的健壮性和可靠性。在实际编程中,掌握这些函数的使用方法,可以更加有效地进行文件操作,提高程序的实用性和稳定性。