2017-06-04 21 views
0

执行以下代码时,我得到以下输出:EOF FAIL。因此,从空文件读取一行设置eofbit和failbit,但不是badbitios :: exceptions(...)在设置badbit时进行更改

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

有人可以解释为什么启用异常改变方式,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差异的答案。但是,这并没有回答这个问题,为什么启用例外,从空文件读取成为“严重错误”,而它不是,如果我不叫,f.exceptions(...)

回答

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并不一定触发异常屏蔽。

+0

既没有调用'f.exception(..)'也没有触发异常。它只是'f.bad()'的结果。为什么这样? – JAyP

+0

@JAyP [我看不出任何行为改变](http://coliru.stacked-crooked.com/a/bd1d35f7aa25fcb3)? –

+0

有趣的是:在gnu/linux上gcc5.4没有改变,但是它在macos上改变了**和clang-800.0.42.1。我没有想到这是平台的依赖。感谢您的回答。 – JAyP

相关问题