首先我假設fin
是你fstream
對象。在這種情況下,您的老師不會告訴您使用while(fin.eof())
從文件中讀取。她會告訴使用while(!fin.eof())
。
讓我解釋一下。 eof()
是fstream
類的成員,該類返回true
或false
值,具體取決於是否已達到正在閱讀的文件的文件結尾(eof)。因此雖然eof()
函數返回0
這意味着文件末尾還沒有到達並且循環繼續執行,但是當eof()
返回1
時文件已到達並且循環結束。
while(fin)
循環被輸入,因爲fin
實際上返回類對象fin
中的錯誤標誌變量的值,當任何函數如讀或寫或打開失敗時,其值被設置爲0。因此,只要循環內的讀取函數有效,循環就會工作。
我個人不會建議他們中的任何一個。 我建議
//假定一個類abc。
abc ob;
While(fin.read((char*)&ob, sizeof(ob)))
{}
或者
While(fin.getline(parameters))
{}
這個循環讀取循環條件裏面的文件記錄,如果沒有是由於文件的末尾被讀取達到退出循環。
while(!fin.eof())
的問題在於,如果已達到文件末尾,它將返回1
。文件結尾實際上是一個放在文件末尾的字符。所以當循環內部的讀取函數讀取這個字符並將一個變量eof設置爲1.所有函數實際上都會返回這個值。
因此,當您正在閱讀單詞中的行時正常工作,但是當您從文件中讀取一個類的連續記錄時,此方法將失敗。 考慮
clas abc
{}a;
Fstream fin("file");
While(!fin.eof())
{
fin.read((char*)&a,sizeof(a));
a.display(); // display is a member function which displays the info }
因此顯示最後一個記錄兩次。這是因爲文件字符的結尾是最後一個記錄的最後一個字節之後的字符。當最後一次讀取時,文件指針位於eof字節處,但尚未讀取。所以它會再次進入循環,但是這次eof char被讀取,但讀取功能失敗。已經在變量a
中的值,即以前的記錄將再次顯示。
不是答案,而是男人,turbo C++是舊的... – HolyBlackCat
比較讀取文件時發生錯誤時的兩個選擇。 – CodesInChaos
@CodesInChaos我在找一些理論上的解釋。我當然可以檢查fin和fin.eof()。事實證明,fin還會檢查失敗標誌以及eof標誌,但我不明白它是如何工作的。 –