0
我有以下代碼,其中的想法是逐行讀取文本文件並保存當前位置m_numBytesRead。因此,如果我打破循環(在我的情況下,通過在大文件上分塊來分割文本),並且嘗試通過使m_numBytesRead-1尋求第二次訪問,ReadString不會像我期望的那樣創建行的開頭。長文件(15 MB)上的CStdioFile :: GetPosition由幾個字節錯誤
CStdioFile fileLog;
if (fileLog.Open(m_strReadFileName, CFile::modeNoTruncate | CFile::modeRead | CFile::shareDenyNone))
{
if (m_numBytesRead > 0)
fileLog.CStdioFile::Seek(m_numBytesRead-1, CFile::begin);
bool bBreakLoop = false;
while (fileLog.ReadString(strLine) && !bBreakLoop)
{
// any condition to set bBreakLoop after few MB read...
if (!bBreakLoop)
{
m_numBytesRead = fileLog.CStdioFile::GetPosition();
}
};
fileLog.Close();
}
通過詳細調試運行更與我得到記事本++指標比較,似乎CStdioFile ::爲getPosition()不給正確的值,來閱讀新線之初,但幾個字節( 12對我的情況)更多...
是MFC上的錯誤還是有我在那裏失蹤的東西?有人看到類似的問題嗎?
請注意,我使用的Windows 7 VS2010
嗯...顯然我並不孤單。而緩衝區不是我的情況(太大的文件)的解決方案:http://forums.codeguru.com/showthread.php?456659-CStdioFile-GetPosition-Seek –
這不是一個具有BOM的Unicode文本文件嗎?另外,不要忘記'CStdioFile'對回車換行對有特殊的處理,所以你在磁盤上看到的內容可能不是你最終讀到的內容。 –
我懷疑問題是單個'0x0A'或'0x0D'換行符; CStdioFile可能會將它們內部轉換爲一對'0x0A0D'而不調整位置/計數器。 –