爲什麼可以使用while循環如如何用while循環讀取文件在C++中工作?
while (file >> variable)
或者
while (getline(xx, yy))
執行>>
和getline
函數返回布爾值讀取文件?
爲什麼可以使用while循環如如何用while循環讀取文件在C++中工作?
while (file >> variable)
或者
while (getline(xx, yy))
執行>>
和getline
函數返回布爾值讀取文件?
流操作符評估爲對流本身的引用。這允許鏈接例如file >> variable >> variable >> variable
。
當您將它與流對象可轉換爲布爾型(其值爲true
,如果沒有設置錯誤標誌)相結合的事實,並且您會得到該效果。
有時它們是爲了方便而製成的;或者,他們返回可澆注到布爾的類型。你應該參考這些函數的文檔(或者流操作符)。
如果我們有這樣的事:
與數據文件:
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)
解決方案避免了這個問題 - 當然,您可能還需要添加一些額外的代碼來說「我期望在這裏有一個數字,並且我還有其他東西」。但是你不必擔心循環會一直持續下去。
設置爲「late」的EOF與額外的換行符無關在文件末尾 - 這是因爲'.eof'在讀取失敗之後被設置爲_EOF,而不是在下一次時。你也沒有回答這個問題。 –
啊,好的。那麼讓我們來看看這個:如果我們有... 19
編輯爲更好地覆蓋EOF情況。 –
另請參閱[爲什麼iostream :: eof內部環路條件被認爲是錯誤的?](https://stackoverflow.com/q/5605125/608639) – jww