【例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.32 87.960000/4.320000=20.361111 输入实数a 和b 的值: 5.2 0 1 Operation not permitted