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头文件。