是否可以在失败后继续从流中读取?

问题描述 投票:2回答:2

我正在使用以下循环从两个文件中读取数字,直到两个文件都用尽:

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
}

我的程序有效。但是可以保证按标准工作吗?也就是说,是否允许我继续从失败的流中读取,或者实现可以选择引发异常?

c++ istream extraction-operator
2个回答
2
投票

简短回答:是的,您可以尝试从流中输入任意多次。将会发生的所有输入尝试都将失败。

长答案:operator >>表现为格式化的输入功能[istream.formatted.arithmetic]。格式化的输入函数将构造一个本地哨兵对象,并且仅在将该哨兵对象转换为bool的结果为true [istream.formatted.reqmts]时才执行输入。默认情况下(如果您没有通过向流提供自定义字符特征来覆盖此行为),将使用类型为std::sentry的对象。仅当std::sentrytrue good()时,为流构造的true才会计算为[istream::sentry]。仅当未设置故障位,无效位或无效位时,good()才返回true。如果[iostate.flags]/7尝试输入(由于成功构建并检查了岗哨),但未成功输入,它将设置故障位operator >>(int&)。如果设置了流的异常掩码中的相应标志(默认情况下未设置),则设置故障位将导致抛出异常[istream.formatted.arithmetic]/3 [iostate.flags]/6。否则,流将仅处于失败状态,并且构造哨兵对象将导致下一次出现[iostate.flags]/5,直到您调用false

例如,我会考虑重写此代码

clear()

0
投票

是的,您可以这样做。一旦流处于失败状态(失败位),进一步的读取也会失败,但这就是您想要发生的事情。这些读取将not引发异常-如果通过流的do { if (int a; file1 >> a) ; // use a if (int b; file2 >> b) ; // use b } while (file1 || file2); 方法显式启用了异常,则故障位将仅生成异常。根据exceptions(),默认值为未启用以下例外:

默认情况下,所有流都具有好位(由于设置了错误状态标志,它们不会引发异常)。

© www.soinside.com 2019 - 2024. All rights reserved.