2011-10-21 28 views
6

是否可以使用getline()讀取有效文件而不設置failbit?我想使用failbit,以便在輸入文件不可讀時生成異常。使用getline()而不設置failbit

以下代碼始終輸出basic_ios::clear作爲最後一行 - 即使指定了有效的輸入。

test.cc:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    ifstream inf; 
    string line; 

    inf.exceptions(ifstream::failbit); 
    try { 
     inf.open(argv[1]); 
     while(getline(inf,line)) 
      cout << line << endl; 
     inf.close(); 
    } catch(ifstream::failure e) { 
     cout << e.what() << endl; 
    } 
} 

input.txt中:

the first line 
the second line 
the last line 

結果:

$ ./a.out input.txt 
the first line 
the second line 
the last line 
basic_ios::clear 
+0

使用函數getline時提出的failbit():

不管怎麼說,上面的代碼應該寫成? – selalerer

+0

如果文件不存在。例如'./a.out nosuchfile.txt' – Jeremiah

+0

爲此,您可以在打開文件後檢查is_open()。 – selalerer

回答

6

你不能。該標準說,大約getline

如果函數提取沒有字符,它調用is.setstate(ios_base::failbit)這可能會引發ios_base::failure(27.5.5.4)。

如果文件以空行結尾,即最後一個字符爲'\ n',則最後一次對getline的調用不會讀取字符並失敗。事實上,如果它不設置failbit,你是如何終止循環? while的條件永遠是真的,它會永遠運行。

我認爲你誤解了failbit意味着什麼。它確實而不是表示該文件不能被讀取。它被用作上次操作成功的標誌。爲了表示低級別故障,使用badbit,但對標準文件流幾乎沒有用處。 failbit和eofbit通常不應被解釋爲特殊情況。另一方面,我認爲fstream :: open應該設置badbit而不是failbit。當你希望

try { 
    ifstream inf(argv[1]); 
    if(!inf) throw SomeError("Cannot open file", argv[1]); 
    string line; 
    while(getline(inf,line)) 
     cout << line << endl; 
    inf.close(); 
} catch(const std::exception& e) { 
    cout << e.what() << endl; 
} 
+0

感謝您解釋'failbit'限制。您的實施工作。 – Jeremiah