我正在尝试理解 stdio 函数 clearerr() 应该在什么情况下使用。
例如,如果我在有效的 FILE* 上进行 fread() 或 fwrite() 操作,并得到一个短计数并且 ferror 为 true,那么我该怎么办?
从我到目前为止所读到的内容来看,fread() 和 fwrite() 都是强大的函数,并且会阻塞和/或重试(如果在较低级别函数中发生锁定和/或中断),因此似乎没有任何必要使用 clearerr(),因为 fread 或 fwrite 错误将是如此灾难性的,以至于没有必要尝试恢复。
此外,ferror() 只告诉我有错误发生,而不是错误是什么。
例如,如果我在有效的 FILE* 上进行 fread() 或 fwrite() 操作,并得到一个短计数并且 ferror 为 true,那么我该怎么办?
从我到目前为止所读到的内容来看,fread() 和 fwrite() 都是强大的函数,并且会阻塞和/或重试(如果在较低级别函数中发生锁定和/或中断),因此似乎没有任何必要使用 clearerr(),因为 fread 或 fwrite 错误将是如此灾难性的,以至于没有必要尝试恢复。
此外,ferror() 只告诉我有错误发生,而不是错误是什么。
#define SZ 1024
FILE* fp = fopen( "foo", "r" );
if ( fp ) {
char b[SZ];
int ch_count = fread( b, sizeof(char), SZ, fp );
if ( ch_count != SZ && ferror( fp ) ) {
// how would clearerr() be used. I don't know?
// ....
// should I drop through here to fclose? (when I've got an ferror)
}
fclose( fp );
}
clearerr()
确实很少使用,基本上就像你所描述的那样。我怀疑它的用途在过去更为普遍,因为I/O设备可能会出现问题,需要手动操作员进行干预解决。但即便如此,今天仍然有一些使用情况。 - John Bollinger