【发布时间】:2016-02-25 09:02:58
【问题描述】:
在解析它们时,我必须从 C 中的流中单独读取字符和子字符串。我还想检查输入错误。这样做的明显方法是:
c = fgetc(f);
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}
/* do something with c */
c = fgetc(f);
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}
/* do something with c */
等等。但是,如果我可以完成所有输入操作并稍后检查错误指示器,那将更加实用和快速(在没有错误的非例外情况下):
c = fgetc(f);
/* do something with c */
c = fgetc(f);
/* do something with c */
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}
如果 fgetc()、scanf() 等输入操作在设置 f 的错误指示符时是简单的 passthrough no-ops 时,这将是可能的。比如说,第一个 fgetc() 发生错误,因此第二个 fgetc() 是一个空操作,它失败但既不改变 f 的错误指示符也不改变 errno。
可能会询问有关输出函数的类似问题。
我的问题是:这是 stdio 函数的行为吗?我可以在所有操作后检查 ferror(f) 并获取 errno,那么如果我确定所有那些“用 c 做某事”的人不会改变 errno?
谢谢!
【问题讨论】:
-
您可以编写一个
myfgetc函数来完成您所描述的操作。 -
当然,一个包装函数。一个明显的解决方案!
-
后续函数调用失败,但其他函数也可能改变
errno的值——不管它们是否失败。因此,您使用建议的方案失去了对errno的准确跟踪,但它可以正常工作。 -
在
fgetc返回EOF 之前,没有理由调用ferror。 -
@William Pursell 即使 fgetc() 不返回 EOF,调用 ferror() 也没有错。如果设置了 ferror(),那么我知道 fgetc() 返回 EOF。
标签: c