8.5 文件中的出错检测
文件操作中的错误在所难免,那么一般都有哪些错误检测方法呢?接下来就介绍一下文件操作中常见的错误检测方法。
1.ferror函数
int ferror(FILE*fp);
功能:检测对文件指针fp所指向的文件读写操作出现的错误。
返回值:没有出错就返回0,出错就返回非0值。
在使用该函数进行错误检测的时候需要注意,由于每次进行读写操作后,再调用ferror函数都会产生一个新的值,因此在调用读写操作函数后要及时地调用ferror函数对其进行检测,否则信息就会丢失。看看下面的代码。
include<stdio.h>
int main()
{
FILEfpin,fpout;
fpin=fopen("bina.txt","r");
if(ferror(fpin))
{
printf("打开失败!\n");
return 0;
}
fputc('a',fpin);
if(ferror(fpin))
{
printf("写入失败!\n");
fclose(fpin);
return 0;
}
fclose(fpin);
return 0;
}
在上面的代码中,对文件bian.txt采用只读方式打开,接下来却通过fputc函数对其进行写入操作,导致出错,所以运行程序后会出现如下信息:
写入失败!
2.clearerr函数
void clearerr(FILE*fp);
功能:复位错误标志。
返回值:无返回值。
如果调用上面的ferror函数进行检测并发现错误,ferror函数就返回一个非0值,那么该值并不会被重新置为0,但是可以人为地将其错误标志清除掉,使其变为0,这需要通过clearerr函数来实现。看看下面的代码。
include<stdio.h>
int main()
{
FILEfpin,fpout;
fpin=fopen("bina.txt","r");
if(ferror(fpin))
{
printf("打开失败!\n");
return 0;
}
fputc('a',fpin);
clearerr(fpin);
if(ferror(fpin))
{
printf("写入失败!\n");
fclose(fpin);
return 0;
}
printf("清除成功!\n");
fclose(fpin);
return 0;
}
运行结果:
清除成功!
在上面的代码中,在调用写入函数出现错误后,通过clearerr函数对其进行清零处理,接下来再次调用该函数的时候,就不会显示“写入失败”的信息了,而会打印接下来的“清除成功!”信息。
3.perror函数
void perror(const char*s);
功能:将上一个函数发生错误的原因输出到标准设备(stderr)。参数s所指的字符串先被打印,后面再加上错误原因字符串。此错误原因依照全局变量error的值来决定要输出的字符串。
返回值:无返回值。
include<stdio.h>
int main()
{
FILEfpin,fpout;
fpin=fopen("fdsa.txt","r");
if(NULL==fpin)
{
perror("E:\fdsa\f.txt");
return 0;
}
fclose(fpin);
return 0;
}
由于在当前目录下并没有fdsa.txt这个文件,因此在运行上面的代码时打印输出了如下信息:
E:\fdsa\f.txt:No such file or directory
打印输出的信息中给出了出错的原因。
4.strerror函数
char*strerror(int errnum);
功能:通过参数errnum返回对应的错误信息。
返回值:errnum所对应的描述信息。
该函数可以把出错的数值信息转化为易于理解的字符串信息,而不再是那些虚无缥缈的数字,便于编程人员对出错的数值信息进行详细分析。通过下面的代码来看看该函数的使用方法。
include<stdio.h>
include<errno.h>
include<string.h>
int main()
{
FILEfpin,fpout;
fpin=fopen("fdsa.txt","r");
if(NULL==fpin)
{
printf("%s\n",strerror(errno));
return 0;
}
fclose(fpin);
return 0;
}
运行结果:
出错信息为:No such file or directory
由上面的运行结果可知,这次同样得到了出错的原因:由于errno是在errno.h的头文件中声明的,因此需要引入errno.h头文件,而strerror函数是在string.h头文件中声明的,所以在此也要引入string.h头文件。