长文件(15 MB)上的CStdioFile :: GetPosition错误几个字节

时间:2015-10-01 16:10:09

标签: c++ mfc cfile

我有以下代码,其思路是逐行读取文本文件并保存当前位置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上的错误还是我在那里缺少某些东西?有人看到类似的问题吗?

请注意,我在Windows 7上使用VS2010。

1 个答案:

答案 0 :(得分:2)

添加开放模式CFile::typeBinary以获得字节精确的偏移量。默认模式是text,它执行换行符转换,这可能会使补偿变得混乱。