CStdioFile::GetPosition для длинного файла (15 МБ) неверно на несколько байтов

У меня есть следующий код, где идея состоит в том, чтобы прочитать текстовый файл построчно и сохранить текущую позицию m_numBytesRead. Так что, если я прерываю цикл (в моем случае, чтобы разбить текст на парсинг больших файлов) и пытаюсь получить доступ во второй раз, выполняя поиск m_numBytesRead-1, ReadString не получает начало строки, как я ожидал,

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 в моем случае) больше...

Это ошибка в MFC или я что-то там пропускаю? Кто-то видит похожие проблемы?

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

1 ответ

Решение

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

Другие вопросы по тегам