2015-10-01 2 views
0

У меня есть следующий код, в котором идея состоит в том, чтобы читать текстовый файл по строкам и сохранять текущую позицию m_numBytesRead. Поэтому, если я сломаю цикл (в моем случае разделить синтаксический анализ текста на куски на больших файлах), и я пытаюсь получить доступ во второй раз, создав Seek m_numBytesRead-1, ReadString не получает начало строки, как я ожидал ,CStdioFile :: GetPosition на длинном файле (15 МБ) неверен несколькими байтами

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(); 
} 

По отладке более подробно и по сравнению с показателями, которые я получаю на Notepad ++, кажется, что CStdioFile :: GetPosition() не дает правильное значение, День новой линии для чтения, но несколько байт (12 на моем случае) подробнее ...

Is is bug on MFC или есть что-то, что мне там не хватает? Кто-нибудь видит похожие проблемы?

Обратите внимание, что я использую VS2010 на Windows 7.

+0

Хммм ... видимо, я не один. И буфер не является решением для моего дела (слишком большие файлы): http://forums.codeguru.com/showthread.php?456659-CStdioFile-GetPosition-Seek –

+2

Это не текстовый файл в формате Юникод с спецификацией? Кроме того, не забывайте, что 'CStdioFile' имеет специальную обработку для пар с обратной связью для возврата, так что то, что вы видите на диске, возможно, не то, что вы читаете. –

+4

Я подозреваю, что проблема связана с символами разрыва строки «0x0A» или «0x0D»; CStdioFile может преобразовывать их внутренне в пару '0x0A0D' без корректировки положения/счетчика. –

ответ

2

Добавить открытый режим CFile::typeBinary получить байт-точное смещение. Режим по умолчанию - это текст, который выполняет преобразование новой строки, что может испортить смещение.