檢查文件是否出錯
- 使用到的函數(shù)
int ferror(FILE * pf)
測試文件是否出錯
返回值: 出錯, 返回非0, 沒有出錯,則返回0
每次在調(diào)用文件輸入輸出函數(shù)的時候,都會產(chǎn)生一個新的ferror函數(shù)值, 所有應(yīng)該即時的調(diào)用這個函數(shù)檢測文件狀態(tài),fopen打開文件時,ferror函數(shù)的初始值自動置為0
- 簡單的測試demo如下:
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE * pf;
pf = fopen("E:/test.txt", "r");
if(pf == NULL){
printf("open file err\n");
return;
}
printf("open file success\n");
fputs("寒塘渡鶴影,冷月葬花魂", pf);
if (ferror(pf) != 0){
printf("file status err\n");
}else{
printf("file status correct\n");
}
if(pf != NULL){
fclose(pf);
}
}
輸出文件錯誤信息
- 使用到的函數(shù)
void perror(const char *s);
在文件狀態(tài)出錯的情況下,先輸出傳入的字符串參數(shù),并且拼接上冒號,然后輸出錯誤的信息
簡單的測試demo:
//需要在E盤創(chuàng)建一個文件test.txt,然后修改文件的屬性為只讀權(quán)限
#include <stdio.h>
#include <stdlib.h>
int main(void){ //手動在 char * path = "E:/test.txt"; FILE * pf = fopen(path, "w"); if(pf == NULL){ printf("open file err"); perror("output error info :"); return 0; } fputs("hello china", pf); fclose(pf); getchar(); return 0; }
清除文件錯誤狀態(tài),恢復(fù)正常
- 使用到的函數(shù)
void clearerr(FILE *pf)
重置文件流的狀態(tài), 清除錯誤信號,使文件恢復(fù)正常狀態(tài),如果不清除,下一次對文件的正常操作還會保持出錯
man手冊中的解釋(本人翻譯)
stdio中的函數(shù)維持了一個對文件的異常指示器,用于記錄對文件流的讀寫操作是否有異常發(fā)生.
同樣的,它也維持一個是否到達文件結(jié)尾的EOF指示器.
使用clearerr()用于清除這兩個指示器
#include <stdio.h>
#include <stdlib.h>
int main(void){ char * path = "E:/test.txt"; FILE * pf = fopen(path, "w"); //以只讀方式文件 if(pf == NULL){ perror("open file error"); //輸出錯誤信息 return -1; } fputs("some times, i walk into the rain", pf); rewind(pf); char ch = fgetc(pf); //從文件讀取一個字符 //可能返回-1(EOF), 讀取失敗返回-1, 讀取到文件最后位置也返回-1 if(ch == EOF){ if(feof(pf)){ //是否到達文件的末尾 printf("at the end of file"); clearerr(pf); //重置文件流的狀態(tài), 清除錯誤信號,文件恢復(fù)正常狀態(tài),如果不清楚,下一次對文件的正常操作還會出錯 } if(ferror(pf)){ //返回非0, 文件io流操作出錯 perror("read file error"); clearerr(pf);//重置文件流的狀態(tài) } } fclose(pf); getchar(); return 0; }