当设置badbit时,ios :: exceptions(...)会发生变化

时间:2017-06-04 14:15:09

标签: c++ exception iostream ifstream

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

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

有人可以解释为什么启用异常会改变方式,设置failbit和badbit。这是在某处记录的吗?

#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差异的答案。但这并没有回答这个问题,为什么在启用例外的情况下,从空文件中读取会成为&#34; 严重错误&#34;而如果我不调用f.exceptions则不会(...)

1 个答案:

答案 0 :(得分:0)

有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的设置不一定会触发您的异常掩码。