我试图了解 stdio 功能何时clearerr()
应该使用。
例如,如果我fread()
or fwrite()
在有效的FILE*
并得到一个简短的计数ferror
是真的,我能做什么?
从我到目前为止所读到的来看,fread()
and fwrite()
很健壮,并且会阻塞和/或重试(如果在较低级别的函数中可能发生锁定和/或中断),因此使用似乎没有任何意义clearerr()
因为fread
or 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
: 当你想模仿的时候tail -f
在未以独占模式打开的文件上。这意味着另一个(或许多其他)进程在文件末尾写入,并且一个进程重复读取即使到达文件末尾后以查看是否有新数据到达。在这种情况下,可能看起来像:
for (;;) {
if (NULL == fgets(line, sizeof(line), fd)) {
sleep(n);
clearerr(fd); // reset EOF condition
}
else {
fputs(line, fdout);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)