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