首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》20.3 错误使用errno函数

关灯直达底部

【例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