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。

《C语言解惑》