2011-10-25 85 views
3

我無法在Visual Studio 2010的C++中將大文件讀入我自己的緩衝區中。下面是我的代碼片段,其中長度是我正在讀取的文件的大小,bytesRead在運行之前設置爲0,並且文件是std :: ifstream。C++讀取()問題

buffer = new char[length]; 
    while(bytesRead < length){ 
     file.read(buffer + bytesRead, length - bytesRead); 
     bytesRead += file.gcount(); 
    } 
    file.close(); 

我注意到,gcount的()在第二次讀取返回0及以後,意思就是閱讀()沒有給我任何新角色,所以這是一個無限循環。我想繼續閱讀文件的其餘部分。我知道即使文件中有更多數據,eofbit也會在第一次讀取後設置。

我不知道我能做些什麼來閱讀更多。請幫忙。

+1

爲什麼你不檢查錯誤?爲什麼'gcount'返回0? – littleadv

+0

我知道eofbit已設置,但實際上文件中有更多數據。我會將這些信息添加到問題中。 – Aura

+1

用第二個參數'(std :: ios_base :: in | std :: ios_base :: binary)打開文件' –

回答

3

確保以二進制模式打開文件(std::ios::binary)以避免任何換行。使用文本模式可能會導致您假定文件的長度是您可以從文件中讀取的字節數。

在任何情況下,如果發生錯誤(可能會無限期地繼續),在讀取和停止之後檢查流的狀態是一種很好的做法。

+0

這實際上是我的問題。我使用file.open(文件名),並將其更改爲file.open(文件名,標準:: ios ::二進制)它工作正常。謝謝。 – Aura

2

聽起來好像您的數據流處於失敗狀態,此時大多數操作都會立即失敗。你需要clear該流才能繼續閱讀。

+1

但知道_why_它處於失敗狀態很重要。 –

+0

@MooingDuck:那要看。在某些情況下,你希望它進入一個失敗的狀態(考慮寫一個'tail -f'的模仿),並且可能不需要檢查每個時間。但是,是的,至少在大多數情況下你可能會這樣做。我當然不是故意暗示你所做的事情只是「清楚」,只有在你清除它之前,所有進一步的閱讀嘗試都將失敗。 –