У меня есть следующий код, в котором идея состоит в том, чтобы читать текстовый файл по строкам и сохранять текущую позицию 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.
Хммм ... видимо, я не один. И буфер не является решением для моего дела (слишком большие файлы): http://forums.codeguru.com/showthread.php?456659-CStdioFile-GetPosition-Seek –
Это не текстовый файл в формате Юникод с спецификацией? Кроме того, не забывайте, что 'CStdioFile' имеет специальную обработку для пар с обратной связью для возврата, так что то, что вы видите на диске, возможно, не то, что вы читаете. –
Я подозреваю, что проблема связана с символами разрыва строки «0x0A» или «0x0D»; CStdioFile может преобразовывать их внутренне в пару '0x0A0D' без корректировки положения/счетчика. –