我试图了解何时clearerr()
应使用stdio函数。
例如,如果我fread()
或fwrite()
某人有效,FILE*
并且获得了短暂的计数并且ferror
为真,我该怎么办?
从我至今读,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
:当您要模仿tail -f
未以独占模式打开的文件时。这意味着另一个(或许多其他)进程在文件末尾写入数据,并且甚至在到达文件末尾后,一个进程也会重复读取,以查看是否有新数据到达。在这种情况下,可能看起来像:
for (;;) {
if (NULL == fgets(line, sizeof(line), fd)) {
sleep(n);
clearerr(fd); // reset EOF condition
}
else {
fputs(line, fdout);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句