C语言中返回错误信息的相关函数用法总结
C语言strerror()函数:返回错误原因的描述字符串
头文件:
#include<string.h>
定义函数:
char*strerror(interrnum);
函数说明:strerror()用来依参数errnum的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回.
返回值:返回描述错误原因的字符串指针.
范例:
/*显示错误代码0至9的错误原因描述*/ #include<string.h> main() { inti; for(i=0;i<10;i++) printf("%d:%s\n",i,strerror(i)); }
执行:
0:Success 1:Operationnotpermitted 2:Nosuchfileordirectory 3:Nosuchprocess 4:Interruptedsystemcall 5:Input/outputerror 6:Devicenotconfigured 7:Argumentlisttoolong 8:Execformaterror 9:Badfiledescriptor
C语言perror()函数:打印最近一次系统错误信息
函数perror()用于抛出最近的一次系统错误信息,其原型如下:
voidperror(char*string);
【参数】string为要输出的错误信息。
说明:perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数string所指的字符串会先打印出,后面再加上错误原因字符串,此错误原因依照全局变量errno的值来决定要输出的字符串。
在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。
【实例】打开一个不存在的文件并输出错误信息。
#include<stdio.h> #include<assert.h> #include<stdlib.h> intmain(void) { FILE*fp; fp=fopen("test.txt","w");/*打开文件*/ assert(fp);/*断言不为空*/ fclose(fp);/*关闭*/ fp=fopen("nulltest.txt","r");/*打开一个不存在的文件*/ if(NULL==fp) { /*显示最近一次错误信息*/ perror("fopen(\"nulltest.txt\",\"r\")"); } return0; }
运行结果:
fopen("nulltest.txt","r"):Nosuchfileordirectory
程序先定义一个文件指针fp,之后创建文件test.txt,断言文件打开成功,然后关闭该文件,再以只读的方式打开文件nulltest.txt,判断该文件指针是否问空,如果为空则使用perror()输出错误信息。perror()用来将上一个函数发生错误的原因输出到标准设备(stderr)。函数参数string所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量error的值来决定要输出的字符串。
如果连续调用perror,如下:
perror("1"); perror("2");
会出现以下结果:
1:success 2:Illegalseek
这种问题出现的原因是:
perror()是通过lseek方法根据errorno查找对应的错误信息,然后输出的。
在程序运行的时候,errorno的初始值对应的信息为:Success。只有程序中有错误出现时,才会改变给errorno。如果没有错误出现,errorno的值是不会改变的。
但是perror方法是个例外,每次调用perror方法,都会首先输出errorno对应的信息,然后重置errorno为undefined,这时如果马上在一次调用perror,perror中的lseek根据undefined去查找错误信息,就会抛错,错误刚好被记录在errorno中,因此,就把lseek的错误打印出来了。所以第一次调用perror方法的时候会正常数据错误信息,但是如果连续调用第二次,由于第一次的perror调用已经把errorno设置成了undefined,所以连续的第二次,第三次...........第一亿次调用都会输出Illegalseek错误。
C语言ferror()函数:检查文件流是否有错误发生
头文件:
#include<stdio.h>
定义函数:
intferror(FILE*stream);
函数说明:ferror()用来检查参数stream所指定的文件流是否发生了错误情况,如有错误发生则返回非0值.
返回值:如果文件流有错误发生则返回非0值.