C標準提供一些用以檢查輸入輸出函數調用中是否出現錯誤的函數。其中主要是ferror函數和clearerr函數。
在調用各種輸入輸出函數(如putc、getc、fread和fwrite等)時,如果出現錯誤,除了函數返回值有所反映外,還可以用ferror函數檢查。它的一般調用形式為
ferror (fp );
如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯。應該注意,對同一個文件每一次調用輸入輸出函數,均產生一個新的ferror函數值,因此,應當在調用一個輸入輸出函數後立即檢查ferror函數的值,否則信息會丟失。在執行fopen函數時,ferror函數的初始值自動置為0。
clearerr函數的作用是使文件錯誤標誌和文件結束標誌置0。假設在調用一個輸入輸出函數時出現了錯誤,ferror函數值為一個非零值。在調用clearerr(fp)之後,ferror(fp)的值變為0。
只要出現錯誤標誌,就一直保留,直到對同一文件調用clearerr函數或rewind函數,或者再次調用一個輸入輸出函數。
【例22.23】下面程序輸出「讀文件出錯!」,找出並改正錯誤。
#include <stdio.h> int main () { char str[128]="How are you ? Fine ! thank you." ; char st[128]={'\0'} ; int length=0 ; FILE *fp ; fp=fopen ("t.txt" ,"w" ); fputs (str , fp ); if (ferror (fp )) { // 輸出出錯信息 printf (" 寫文件出錯!\n" ); // 置位出錯標誌 clearerr (fp ); } // 把文件的位置指針移到離文件尾16 字節處 fclose (fp ); fp=fopen ("t.txt" ,"w" ); fgets (st ,4 ,fp ); // 取How printf ("%s\n" , st ); if (ferror (fp )) { // 輸出出錯信息 printf (" 讀文件出錯!\n" ); // 置位出錯標誌 clearerr (fp ); } fclose (fp ); return 0 ; }
【解答】第2次打開方式錯誤,應將w改為r。