我正在使用以下循环从两个文件中读取数字,直到两个文件都用尽:
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]。格式化的输入函数将构造一个本地哨兵对象,并且仅在将该哨兵对象转换为bool
的结果为true
[istream.formatted.reqmts]时才执行输入。默认情况下(如果您没有通过向流提供自定义字符特征来覆盖此行为),将使用类型为std::sentry
的对象。仅当std::sentry
为true
good()
时,为流构造的true
才会计算为[istream::sentry]。仅当未设置故障位,无效位或无效位时,good()
才返回true。如果[iostate.flags]/7尝试输入(由于成功构建并检查了岗哨),但未成功输入,它将设置故障位operator >>(int&)
。如果设置了流的异常掩码中的相应标志(默认情况下未设置),则设置故障位将导致抛出异常[istream.formatted.arithmetic]/3 [iostate.flags]/6。否则,流将仅处于失败状态,并且构造哨兵对象将导致下一次出现[iostate.flags]/5,直到您调用false
…
例如,我会考虑重写此代码
clear()
是的,您可以这样做。一旦流处于失败状态(失败位),进一步的读取也会失败,但这就是您想要发生的事情。这些读取将not引发异常-如果通过流的do
{
if (int a; file1 >> a)
; // use a
if (int b; file2 >> b)
; // use b
} while (file1 || file2);
方法显式启用了异常,则故障位将仅生成异常。根据exceptions(),默认值为未启用以下例外:
默认情况下,所有流都具有好位(由于设置了错误状态标志,它们不会引发异常)。