映月读书网 > C语言解惑 > 20.3 错误使用errno函数 >

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