2017-06-04 19 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

相關問題