2015-10-01 54 views
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

+0

嗯...顯然我並不孤單。而緩衝區不是我的情況(太大的文件)的解決方案:http://forums.codeguru.com/showthread.php?456659-CStdioFile-GetPosition-Seek –

+2

這不是一個具有BOM的Unicode文本文件嗎?另外,不要忘記'CStdioFile'對回車換行對有特殊的處理,所以你在磁盤上看到的內容可能不是你最終讀到的內容。 –

+4

我懷疑問題是單個'0x0A'或'0x0D'換行符; CStdioFile可能會將它們內部轉換爲一對'0x0A0D'而不調整位置/計數器。 –

回答

2

加入開放模式CFile::typeBinary得到字節確切的偏移。默認模式是文本,執行新行轉換可能會影響偏移。