【例20.14】演示使用errno函数的例子。
#include<stdio.h>#include<errno.h>#include<string.h>int main(void){ FILE *fp; char Line[100]; fp=fopen("f://ct4//cfile.txt","r"); if(errno) { printf("/n文件打不开!/n"); return -1; } fgets(Line,100,fp); //读文件的一行信息 puts(Line); //显示 fclose(fp); //关闭文件 getchar(); return 0;}
当文件不存在时,运行结果为:
文件打不开!
当文件存在时,运行结果为:
How are you?
从运行结果看,程序好像很正常。其实,这不具备普遍性。很多库函数,特别是那些与操作系统有关的库函数,当它们执行失败时会通过一个名为errno的全局变量,通知程序该函数调用失败。
但在设计库函数时,并没有要求库函数调用正确时,一定要设置errno为0,这时errno的值就可能是前一个调用失败的库函数设置的值。如果是这样,就会给这种处理方式带来错误。这里之所以表现正常,是因为fopen函数的设计设置了errno的原因。
正确的做法是在调用库函数时,首先检查作为错误指示的返回值,确定程序执行已经失败。然后再检查errno,以便搞清出错的原因。推荐的格式为:
//调用库函数 if (返回的错误值) //检查errno得到错误类型
将上面的程序改为如下形式。
#include<stdio.h>#include<errno.h>#include<string.h>int main(void){ FILE *fp; char Line[100]; fp=fopen("f://ct4//cfile.txt","r"); if(fp==NULL) { printf("%d %s/n",errno,strerror(errno)); return -1; } fgets(Line,100,fp); //读文件的一行信息 puts(Line); //显示 fclose(fp); //关闭文件 getchar(); return 0;}
当文件不存在时,运行结果为:
2 No such file or directory
当文件存在时,运行结果为:
How are you?
程序中的strerror函数用来输出用户程序错误信息。它的定义在头文件string.h中。
下面举一个简单的例子说明errno的使用方法。
【例20.15】演示在除法函数中使用errno函数的例子。
#include<stdio.h>#include<errno.h>#include<string.h>double pe(double,double);int main(void){ double a,b,c; printf("输入实数a和b的值:"); scanf("%lf%lf",&a,&b); c=pe(a,b); if(c==0) { printf("%d %s/n",errno,strerror(errno)); return -1; } printf("%lf/%lf=%lf/n",a,b,c); return 0; } double pe(double a,double b) { if (b==0) { errno=1; return 0; }else{ return a/b; }}
运行示例如下。
输入实数a和b的值:87.96 4.3287.960000/4.320000=20.361111输入实数a和b的值:5.2 01 Operation not permitted