2013-07-29 110 views
2

的代碼是:`eof``是`ifstream`的有效狀態嗎?

ifstream fin("D://abc.txt", ios::in); 
string line; 
while (fin) { 
    getline(fin, line); 
    cout << line << endl; 
} 

的文本文件是:

hi, I am Eric! 
hi, I am Jack! 

,輸出是

hi, I am Eric! 
hi, I am Jack! 
hi, I am Jack! 

當我改變條件!fin.eof(),輸出是正確的。 eof的有效狀態ifstream

+1

最好的方式來閱讀'while(std :: getline(fin,line)){}' – P0W

回答

3

eof狀態,一旦你嘗試閱讀過去流結束時只達到。從文件中讀取最後一行的getline調用不會這樣做(直到換行符纔讀取)。但是在循環的下一次迭代中調用getline將達到文件的末尾。

一種更好的方式來讀取文件中的每一行是:

while (getline(fin, line)) { 
    cout << line << endl; 
} 
4

這是因爲狀態沒有改變,直到std::getline功能失敗。這意味着您正確讀取前兩行,但狀態不會改變,因此您再次輸入,但現在std::getline調用失敗,但您不檢查它,現在也是eof國旗已設置。

你應該做

while (std::getline(...)) 
{ 
    // ... 
} 
1

的使用

while(fin) 

不好。它會檢查fin的值,而不是fin是否達到最終值。

您可以檢查此頁: http://www.cplusplus.com/reference/string/string/getline/

,當你完成功能函數getline的第二個電話時,指針鰭不是指向NULL,讓你去進入,而第三種方法中,第三次打電話

getline(fin,line); 

它滿足散熱片,所以散熱片改變狀態的EOF,那麼你就不會去第四電話,但因爲你沒有明確的

line 

所以它也將打印

hi, I am Jack!