2014-04-06 57 views
3

所以我正在使用while循環讀取文本文件中的數據。使用while循環讀取文本文件中的數據

我原本代碼中設置了這種方式:

iftream infile; 
while(infile) // or even if i do while(!infile.eof()) 
    { 
     infile>>data; 
     vector1.push_back(data); //adding data in to the vector 
    } 

- 但這導致其在最後一個項目在文本文件中由於某種原因,讀兩遍一個小問題。

但如果我有這種方式設置的一切代碼工作正常:

iftream infile; 
while(infile>>data) 
{ 
    vector1.push_back(data); //adding data in to the vector 
} 

爲什麼第一個代碼在過去的項目中,讀兩次?

+1

它不讀取最後一個項目兩次。相反,你忽略了*最後一次讀取* **失敗**的事實,然後盲目插入最後一次成功迭代的讀取。通過測試提取的成功作爲循環的條件,你可以避免這個問題。簡而言之,在使用它們之前驗證您的提取(您的第二個代碼段和第一個代碼段不會*)*。 – WhozCraig

+0

@WhozCraig甚至第一個片段..它應該跳過while循環,當它看到沒有什麼可讀的,對吧? while(!infile.eof())意味着它只會做循環,只要它不是文件的結尾..但是一旦它的文件結束,它應該跳過循環吧? – psj01

+0

不完全。鏈接副本是老實說,你會得到最好的描述,你爲什麼不簡單地在循環控制條件中使用eof或eof-logic。表達式'inifile'與'!inifile.fail()'是同義的,只要不設置壞位和失敗位,它就是真的。既然還沒有設置(你沒有嘗試讀* *超出* eof並且沒有發生其他故障),表達式仍然是正確的。 – WhozCraig

回答

3

它看起來像你的data結構沒有完全對齊在文件內,即當你的程序試圖讀取最後一個片段時,它還沒有達到文件的結尾,但沒有足夠的數據讀取。所以infile >> data失敗,這意味着data的內容沒有改變,因此你再次將它添加到你的向量。

在第二種情況下,您檢查讀取的結果,因此,如果未正確讀取內容,則不會嘗試推送data內容。

+0

但是它是如何進入while循環的,因爲如果while(infile)是真的,它應該只進入循環。如果沒有東西要讀,那麼它應該跳過循環吧?那是我的邏輯。 – psj01

+0

我想(這是我沒有看到你的數據結構def和文件內容就可以做的唯一事情),它還沒有到達文件的末尾(例如,有一些空間或類似的東西),所以它仍然嘗試讀取下一個數據塊並失敗。 – Ashalynd

相關問題