test1.c:
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; if((fp = fopen("不存在的文件.txt","r")) == NULL) { printf("标准输出 "); fputs("打开文件失败! ", stderr); exit(EXIT_FAILURE);//退出 } //do something... return 0; } /*运行结果: 标准输出 打开文件失败! 请按任意键继续. . . */
重定向:
这里给大家补充一个课外知识点,由于标准输出和标准错误输出通帝都是直接打印到辱幕上,为了区分它们,我们可以使用Linux shel1的重定向功能:
- 重定向标准输入使用 <
- 重定向标准输出使用 >
- 重定向标准错误输出使用 2>
上述程序结果:
错误处理
错误指示器—ferror。
test2.c:
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int ch; if((fp = fopen("output.txt","r")) == NULL) { printf("标准输出 "); fputs("打开文件失败! ", stderr); exit(EXIT_FAILURE);//退出 } while(1) { ch = fgetc(fp); if(feof(fp))//feof:文件尾指示器 { break; } putchar(ch);// 将读取到的字符打印出来 } fputc("abc", fp);//因为通过只读打开的,不能写入 if(ferror(fp)) { fputs("出错了! ", stderr); } fclose(fp); return 0; }
结果:
使用clearerr函数可以人为地清除文件末尾指示器和错误指示器的状态。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int ch; if((fp = fopen("output.txt","r")) == NULL) { printf("标准输出 "); fputs("打开文件失败! ", stderr); exit(EXIT_FAILURE);//退出 } while(1) { ch = fgetc(fp); if(feof(fp))//feof:文件尾指示器 { break; } putchar(ch);// 将读取到的字符打印出来 } fputc("abc", fp);//因为通过只读打开的,不能写入 if(ferror(fp)) { fputs("出错了! ", stderr); } clearerr(fp); if(feof(fp) || ferror(fp)) { printf("不会被打印出 "); } fclose(fp); return 0; }
结果:
ferror虽数只能检测是否出错,但无法获取错误原因。不过,大多数条统函数在出现错误的时候会将错误原因记录在errno中。需要errno.h头文件。
test3.c:
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { FILE *fp; if((fp = fopen("不存在的文件.txt","r")) == NULL) { printf("打开文件失败!原因是:%d ", errno); exit(EXIT_FAILURE);//退出 } fclose(fp); return 0; } /*运行结果: 打开文件失败!原因是: 请按任意键继续. . . */
perror函数可以直观地打印出错误原因。不需要 errno.h 头文件。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; if((fp = fopen("不存在的文件.txt","r")) == NULL) { perror("打开文件失败!原因是:");//不能将错误原因放在字符串中间,可以用下文中的strerror函数 exit(EXIT_FAILURE);//退出 } fclose(fp); return 0; } /*运行结果: 打开文件失败!原因是:: No such file or directory 请按任意键继续. . . */
strerror函数直接返回错误码对应的错误信息。需要 errno.h 头文件。
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { FILE *fp; if((fp = fopen("不存在的文件.txt","r")) == NULL) { fprintf(stderr,"出错!原因是: %s ,唉!!!! ",strerror(errno)); exit(EXIT_FAILURE);//退出 } fclose(fp); return 0; } /*运行结果: 出错!原因是: No such file or directory ,唉!!!! 请按任意键继续. . . */