讀古今文學網 > C語言解惑 > 22.5 操作出錯檢測及錯誤標誌的復位 >

22.5 操作出錯檢測及錯誤標誌的復位

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。