2014-09-12 247 views
-2

在下面的代碼塊中,我創建了一個numbers.txt文件,它上面寫有數字1,不應該將該程序吐出單詞OK回無限次,因爲它會通過eof標記文件輸入輸出C++

while (!sample.eof()) 
{ 
     char ch; 
     sample.get(ch); 
     sample.seekp(-1L, ios::cur); 
     sample >> initialnumber; 
     sample.seekp(2L, ios::cur); 
     cout << "OK"; 

} 
+0

你在哪裏打開'sample'? – tadman 2014-09-12 16:22:04

+0

我已經在上面的代碼中打開了它們它們沒有語法錯誤我已經打開並關閉了文件 – 2014-09-12 16:25:18

+0

流狀態是粘滯的,它只在明確請求時被清除,這就是爲什麼這隻會在第一次達到時纔會循環EOF。另一方面,我不知道我真的理解你的問題... – 2014-09-12 16:25:54

回答

0

有沒有這樣的事,作爲一個 「EOF標記物」 。 EOF僅僅是一個文件條件,通過在文件末尾處或之後定義。無論您尋求1個字節還是尋找100000個字節都沒有區別:如果您的文件位置指針超過了結尾,那麼您處於或超出了文件結尾。

您的代碼讀取一個字符,然後備份(實質上取消了字符讀取)。然後它讀取一個整數並跳過兩個字符。這具有始終在文件中向前移動的效果(即使整數讀取失敗)。因此,你最終會擊中EOF:這裏沒有無限循環。


在DOS時代,文件可能包含0x1A的字節(「ASCII EOF」),這將導致某些文本閱讀器停在該字節。文件內容可以物理擴展到這個字節之外,但文本實用程序可能拒絕讀取它。然而,標準的C++庫像其他任何字符一樣對待0x1A,並且會很高興地閱讀它。

+0

確定這是有道理的這是我最初雖然但我的教授和這個網站上的這個其他人完全反駁了我已讀的所有內容 – 2014-09-12 16:34:32

+0

如果你的意思是烏爾裏奇,他不是在試圖抵觸任何事情。他在談論一個不同的問題,並且因爲你的問題不清楚而感到困惑。 – nneonneo 2014-09-12 16:35:24

+0

但我做了一個不同的程序,它遵循類似的邏輯,它完全相反,這次是在無限循環中 – 2014-09-12 16:35:56