標準流和錯誤處理
阿新 • • 發佈:2019-03-09
補充 close fputc lur font -s 是否 perror 一個
test1.c:
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; if((fp = fopen("不存在的文件.txt","r")) == NULL) { printf("標準輸出\n"); fputs("打開文件失敗!\n", 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("標準輸出\n"); fputs("打開文件失敗!\n", stderr); exit(EXIT_FAILURE);//退出 } while(1) { ch = fgetc(fp); if(feof(fp))//feof:文件尾指示器 { break; } putchar(ch);// 將讀取到的字符打印出來 } fputc("abc", fp);//因為通過只讀打開的,不能寫入 if(ferror(fp)) { fputs("出錯了!\n", 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("標準輸出\n"); fputs("打開文件失敗!\n", stderr); exit(EXIT_FAILURE);//退出 } while(1) { ch = fgetc(fp); if(feof(fp))//feof:文件尾指示器 { break; } putchar(ch);// 將讀取到的字符打印出來 } fputc("abc", fp);//因為通過只讀打開的,不能寫入 if(ferror(fp)) { fputs("出錯了!\n", stderr); } clearerr(fp); if(feof(fp) || ferror(fp)) { printf("不會被打印出\n"); } 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\n", 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 ,唉!!!!\n",strerror(errno)); exit(EXIT_FAILURE);//退出 } fclose(fp); return 0; } /*運行結果: 出錯!原因是: No such file or directory ,唉!!!! 請按任意鍵繼續. . . */
標準流和錯誤處理