2012-12-23 52 views
3

爲什麼可以使用while循環如如何用while循環讀取文件在C++中工作?

while (file >> variable) 

或者

while (getline(xx, yy)) 

執行>>getline函數返回布爾值讀取文件?

+0

另請參閱[爲什麼iostream :: eof內部環路條件被認爲是錯誤的?](https://stackoverflow.com/q/5605125/608639) – jww

回答

7

流操作符評估爲對流本身的引用。這允許鏈接例如file >> variable >> variable >> variable

當您將它與流對象可轉換爲布爾型(其值爲true,如果沒有設置錯誤標誌)相結合的事實,並且您會得到該效果。

0

有時它們是爲了方便而製成的;或者,他們返回可澆注到布爾的類型。你應該參考這些函數的文檔(或者流操作符)。

2

如果我們有這樣的事:

與數據文件:

11 
22 
13 
45 
19 

,然後一個C++文件:

int variable; 
int count = 0; 
while(!file.eof()) 
{ 
    count ++; 
    file >> variable; 
} 
cout << "there are " << count << " numbers in the file"; 

從這個輸出是6,因爲當我們讀到19時,eof是錯誤的,只有當我們試圖讀取下一個數字時eof纔會被設置。我們可以通過將count ++移到if語句來解決這個問題,所以我們有if (file >> variable) count++;。但是這很笨拙。

如果我們不是這樣做:

while(file >> variable) 
{ 
    count++; 
} 

退出循環時,當我們嘗試後19

編輯讀取下一個數字:修復「之所以它計數錯誤」,以澄清EOF( )在「不成功讀取」後設置。

還應該指出while(!file.eof())不適用於錯誤的輸入。假設我們有上面的代碼,但是輸入是11 22 aa ... - 當輸入是aa時,eof()不會被設置。輸入剛停止並返回一個錯誤。但是由於eof()仍然是錯誤的[我們可以在技術上從文件中讀取更多內容,只要我們不嘗試將其讀取爲數字]。所以這會導致無限循環! while (file >> variable)解決方案避免了這個問題 - 當然,您可能還需要添加一些額外的代碼來說「我期望在這裏有一個數字,並且我還有其他東西」。但是你不必擔心循環會一直持續下去。

+0

設置爲「late」的EOF與額外的換行符無關在文件末尾 - 這是因爲'.eof'在讀取失敗之後被設置爲_EOF,而不是在下一次時。你也沒有回答這個問題。 –

+0

啊,好的。那麼讓我們來看看這個:如果我們有... 19 ,它仍然不會設置.eof(),直到下一次嘗試閱讀? 無論哪種方式,使用eof來確定文件結尾是不好的,使用「嘗試讀取並查看它是否失敗」效果更好。 –

+0

編輯爲更好地覆蓋EOF情況。 –

相關問題