int a, b;
while (file1 >> a, file2 >> b, file1 || file2) {
if (file1 && file2) ... // use of both a and b
if (file1) ... // use of a
if (file2) ... // use of b
}
我的程序可以工作。但是它是否按照标准保证运行?也就是说,我是否被允许从失败的流中继续读取,或者实现可以选择抛出异常?
int a, b;
while (file1 >> a, file2 >> b, file1 || file2) {
if (file1 && file2) ... // use of both a and b
if (file1) ... // use of a
if (file2) ... // use of b
}
简短回答:是的,您可以尝试从流中输入任意次数的内容,即使之前尝试输入失败了。所有在失败尝试后的输入尝试都将失败。
长答案: operator >>
表现为一个格式化输入函数 [istream.formatted.arithmetic]。 格式化输入函数构造一个本地的sentry对象,只有在将该sentry对象转换为bool
时结果为true
[istream.formatted.reqmts]时才执行输入操作。 默认情况下(如果您没有通过向流提供自定义字符特征来覆盖此行为),将使用std::sentry
类型的对象。已为流构造的std::sentry
仅在good()
为true
[istream::sentry]时才会评估为true
。只有当failbit、badbit和eofbit都未设置时,good()
才会返回true[iostate.flags]/7。 如果operator >>(int&)
由于成功构造并检查了sentry而尝试输入但未能输入,则会设置failbit[istream.formatted.arithmetic]/3。 如果流的异常掩码中对应的标志被设置(默认情况下未设置),则设置failbit将导致抛出异常[iostate.flags]/6[iostate.flags]/5。否则,流将处于失败状态,并且下一次构造sentry对象将导致结果为false
,直到您调用clear()
…
我会考虑重写这段代码,例如
do
{
if (int a; file1 >> a)
; // use a
if (int b; file2 >> b)
; // use b
} while (file1 || file2);
if
的条件语句中声明一个变量,谢谢!但是对于我的第一个if
,我想同时使用a
和b
,你有什么建议吗? - AlwaysLearning是的,你可以这样做。一旦流进入失败状态(failbit),进一步的读取也将失败,但这正是你想要发生的。这些读取将不会抛出异常 - 只有在通过流的exceptions()方法明确启用时,failbit才会生成异常。根据this source,默认情况下这些异常未被启用:
所有流默认都具有goodbit(它们不会因设置错误状态标志而引发异常)。