在流的打开和关闭笔记中的示例中,如果打开的文件不存在,同时 mode
参数选择 r
或 r+
,那么程序运行将会出错,错误信息为文件不存在,一般会由系统返回这个错误信息。错误信息所对应的一个错误码会被保存在全局变量errno
中。程序员可以通过相应的函数打印这个错误信息。
错误处理相关函数 perror()
被用来输出保存在变量 errno
中的错误码所对应的错误信息。
#include <stdio.h> void perror(const char *s);点击复制复制失败已复制
参数 s
可以自行定义,可传入一个提示错误的字符串,如下所示:
#include <stdio.h> int main(int argc, const char *argv[]) { FILE *fp; if ((fp = fopen("test.txt", "r")) == NULL) { perror("fopen error"); return -1; } fclose(fp); return 0; }点击复制复制失败已复制
如果被打开的文件 test.txt
不存在, mode
参数选择为 r
,运行结果如下所示:
$ gcc main.c && ./a.out fopen error: No such file or directory点击复制复制失败已复制
字符串 fopen error
作为参数传递给 perror()
函数,并最终输出。系统输出的错误信息为 No such file or directory
。关于错误信息的定义在 <asm-generic/errno-base.h>
中可查看,信息对应的错误码为 ENOENT
,并保存在 errno
变量中。
#define ENOENT 2 /* No such file or directory */点击复制复制失败已复制
strerror()
函数也可用于处理相关错误,效果与 perror
类似, strerror()
函数同样用于打印错误码所对应的错误信息。
#include <string.h> char *strerror(int errnum);点击复制复制失败已复制
参数 errnum
需要传入错误码,由于函数运行产生错误,系统会将错误码保存在全局变量 errno
中,因此参数直接传递 errno
便可。使用示例如下:
#include <stdio.h> #include <string.h> #include <errno.h> int main(int argc, const char *argv[]) { FILE *fp; if ((fp = fopen("test.txt", "r")) == NULL) { printf("fopen error:%s\n", strerror(errno)); return -1; } fclose(fp); return 0; }点击复制复制失败已复制
运行结果如下所示:
$ gcc main.c && ./a.out fopen error:No such file or directory