我试图理解何时应该使用stdio函数clearr()
。
例如,如果我对有效的文件*
执行fread()
或fwrite()
,并得到一个短计数,并且ferror
为真,我该怎么办?
从我到目前为止所读到的,fread()
和f写()
是健壮的,并且会阻止和/或重试(如果有锁和/或中断可能发生在较低级别的函数中),所以使用<代码>clearerr()因为fread
或f写
错误将是如此灾难性,以至于没有必要尝试恢复。
另外,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 );
}
clearr()
清除流中的错误和EOF标志。
说FILE
是这样的:
typedef struct {
int fd;
char *buf;
int error;
int eof;
} FILE;
FILE *file;
这将设置文件-
这样做的一些原因包括文件I/O,例如当一个文件给出EOF,但另一个程序(或另一个线程等)附加到它时。如果在执行此操作后清除错误,则可以让程序充当某种
tail-f
-substitute。
设置FILE
错误状态的函数(由ferror
报告)即使稍后调用成功,也不会清除它。同样,如果您在读取时遇到文件结束,即使文件稍后有更多可用数据,也不会自动清除。
基本上,这意味着如果您使用ferror
来检查错误状态,并且您有一些方法可以从中恢复,则ferror
将继续指示错误,直到您使用clearerr
。
在您的示例中,如果只使用fread
的返回值作为终止读取的条件(即,EOF和任何类型的错误都被视为最终错误),则无需clearr
:只需转到fclose
(并且可能使用ferror
来确定是否打印错误消息)。
另一方面,如果FILE
实际上是一个流,读取可以在以后成功,并且您检测到(或假设)特定条件并重试,您应该在重试之前clearerr
,否则您将继续看到旧错误未来尝试的条件。
同样,正如注释中指出的,clearerr
也清除了文件状态的结束,所以这也适用于使用feof
检查文件的结束。但是,请注意,您通常不应该使用!feof(file)
作为读取时的循环条件。(
clearerr
至少有一个真实世界的用例:当您想在一个没有以独占模式打开的文件上模拟尾-f
时。这意味着另一个(或许多其他)进程在文件末尾写入,一个进程甚至在到达文件末尾后重复读取,以查看新数据是否已经到达。在这种情况下,可以看起来像:
for (;;) {
if (NULL == fgets(line, sizeof(line), fd)) {
sleep(n);
clearerr(fd); // reset EOF condition
}
else {
fputs(line, fdout);
}
}
问题内容: 我不了解Java的这一功能。我知道它使编码更容易,有时看起来更整洁,但这的实际用途是什么?相反,我觉得最好显示警告,因为将来任何人在修改代码之前都可以引用它们。这@SuppressWarnings是否提高了编译效率,还是根据任何编码标准? 问题答案: 其他答案已经解释了很多用例,但是我想强调一点, 有时您绝对需要使用它来克服语言本身的局限性,在这些情况下,使用绝对是合法的。 在其他情况
问题内容: java中有什么用? 请解释一下。 问题答案: 可能这个例子会帮助您。
本文向大家介绍sinon.js的用途是什么?,包括了sinon.js的用途是什么?的使用技巧和注意事项,需要的朋友参考一下 SinonJS提供独立的测试间谍,存根和模拟。这是一个我们可以用来创建用于单元测试的对象模拟的库。 间谍-可以用来追踪执行情况的伪造函数。 存根-函数替换,我们可以从中返回所需的内容或使我们的函数以适合我们测试多个场景的方式工作。 嘲笑-假方法 所有这些对象都有助于对我们的代
问题内容: 我碰巧看到一个有风格的!in有什么用? 问题答案: 使元素下降到文档中位于其之前的所有浮动元素之下。 您也可以使用或使其仅落在向左或向右浮动的那些元素下方。
问题内容: 我最近遇到了一个由于数据库创建脚本中的输入错误而导致的问题,即在数据库中创建了而不是的列。 我以为0长度字符串字段会出错,但是我没有。无论如何,或者我将无法在此列中存储任何数据的目的是什么。 问题答案: 根据SQL-92标准不允许,但在MySQL中允许。从MySQL手册: MySQL允许您创建type的列。这主要在您必须与依赖于列存在但实际上不使用其值的旧应用程序兼容时很有用。当您需要
问题内容: 我对Bash脚本非常陌生,有人可以向我解释$#和$的情况吗?在以下代码中工作? 问题答案: 在Y分钟内来自Learn Bash :