【问题标题】:ios::exceptions(...) changes when badbit is set设置 badbit 时 ios::exceptions(...) 发生变化
【发布时间】:2017-06-04 14:15:09
【问题描述】:

执行以下代码时,我得到以下输出:EOF FAIL。所以从空文件中读取一行会设置 eofbit 和 failbit,但不是 badbit

如果我通过取消注释第 11 行来启用异常,输出会更改:EOF BAD FAIL。现在从空文件中读取一行会设置 eofbit、badbit,但不是 failbit(否则会发生异常)。

有人可以解释为什么启用异常会改变设置失败位和坏位的方式。这是否记录在某处?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char const *argv[]) {
    ifstream f("some_empty_file");
    string line;

    // f.exceptions(std::ifstream::failbit); // (line 11)

    getline(f, line);
    if(f.eof()) cout << "EOF ";
    if(f.bad()) cout << "BAD ";
    if(f.fail()) cout << "FAIL ";

    cout << endl;
    f.close();

    return 0;
}

编辑:我在https://stackoverflow.com/a/11085193/3821618 上阅读了关于 badbit 和 failbit 区别的答案。但这并不能回答问题,为什么在启用异常的情况下,从空文件读取会变成“严重错误”,而如果我不调用 f.exceptions(...)

【问题讨论】:

    标签: c++ exception iostream ifstream


    【解决方案1】:

    有 4 种不同的流状态(取自 std::ios_base::iostate):

     typedef /*implementation defined*/ iostate;
     static constexpr iostate goodbit = 0;
     static constexpr iostate badbit = /*implementation defined*/
     static constexpr iostate failbit = /*implementation defined*/
     static constexpr iostate eofbit = /*implementation defined*/
    

    所以eofbit 的设置不一定会触发您的异常掩码。

    【讨论】:

    • 无论是否调用f.exception(..),都会触发异常。只有f.bad() 的结果才会改变。为什么会这样?
    • 有趣:在 gnu/linux 上使用 gcc5.4 没有改变行为,但在 macos 上使用 clang-800.0.42.1 确实改变了。我没想到这取决于平台。谢谢你的回答。
    • @JAyP 有/*implementation defined*/ cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2022-12-22
    • 2011-05-09
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多