2017-06-22 165 views
0

有人告訴我在閱讀文件時應該使用while(fin)而不是while(!fin.eof())Turbo C++:while(fin)vs while(!fin.eof())

究竟是什麼區別?

編輯:我知道while(fin)實際上會檢查流對象,並且當它變爲NULL時,循環會中斷並覆蓋eof和失敗標誌。 但我的課程老師說fin.eof()更好,所以我需要了解這裏發生的基本操作。

哪一個是正確的做法?

注意:這不是重複的,我需要Turbo C++和二進制文件的幫助。 我基本上正在嘗試使用類對象讀取文件。

+7

不是答案,而是男人,turbo C++是舊的... – HolyBlackCat

+0

比較讀取文件時發生錯誤時的兩個選擇。 – CodesInChaos

+0

@CodesInChaos我在找一些理論上的解釋。我當然可以檢查fin和fin.eof()。事實證明,fin還會檢查失敗標誌以及eof標誌,但我不明白它是如何工作的。 –

回答

1

首先我假設fin是你fstream對象。在這種情況下,您的老師不會告訴您使用while(fin.eof())從文件中讀取。她會告訴使用while(!fin.eof())

讓我解釋一下。 eof()fstream類的成員,該類返回truefalse值,具體取決於是否已達到正在閱讀的文件的文件結尾(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中的值,即以前的記錄將再次顯示。

0

一個很好的方法是做這樣的事情:

while (instream.read(...) && !instream.eof()) { //Reading a binary file 
     Statement1; 
     Statement2; 
} 

或文本文件的情況下:

while ((ch = instream.get()) && !instream.eof()) { //To read a single character 
     Statement1; 
     Statement2; 
} 

這裏,對象被while循環的條件語句中的讀取和那麼eof標誌的值正在測試中。 這不會導致不希望的輸出。

這裏我們一起檢查實際I/O操作和eof的狀態。您也可以檢查失敗標誌。

我想指出,根據@RetiredNinja,我們可能只檢查I/O操作。 那就是:

while (instream.read(...)) { //Reading a binary file 
     Statement1; 
     Statement2; 
}