errno本身是一个整型的全局变量,当使用errno的库函数,在执行出错时,只通过函数返回值返回一个表示出错的标识,如-1或NULL等,具体的出错原因会被赋值到errno中。通过查询errno可以确定具体的出错原因。
在errno.h中定义了一系列常见的宏,其形式为
#define EPERM 1 /* Operation not permitted */
可以划分为
1 定义一个宏名,以E开头;
2 定义其值,为一个正整数;
3 一个注释区域,说明该错误号出现时的具体错误内容。
errno.h中的条目因不同编译器的实现而有所区别,一般在100~128条范围内,具体内容可以在编译器的系统标准头文件夹下查看对应文件。
c语言标准库函数里没有error函数。C语言对异常的处理确实不够好,大多的时候都需要人工除错。有几个类似的函数,分别处理各种情况下的异常:
ferror函数:在调用各种输入输出函数(如
putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。
它的一般调用形式为
ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件
每一次调用输入输出函数,均产生一个新的ferror函
数值,因此,应当在调用一个输入输出函数后立即检
查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。
perror函数:
用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数
s
所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno
的值来决定要输出的字符串。
strerror函数:用来
从错误号码
查
用英文表达的错误内容,返回指针,指向这段英文字符串。如果你不知道错误号,那么在出错发生时,及时用
errno
的当前值
作参数,打印这段字符串。
一般都是在处理文件时用到的比较多,如:
#include <stdio.h>#include <stdlib.h>
int main(void)
{
perror("File error ")
}
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp
if((fp=fopen("test", "rb"))==NULL) {
printf("Cannot open file.\n")
exit(1)
}
putc('C', fp)
if(ferror(fp)) { // 检测文件是否出错
printf("File Error\n")
exit(1)
}
fclose(fp)
return 0
}