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



我有以下代码,其中的想法是逐行读取文本文件并保存当前位置m_numBytesRead。因此,如果我打破循环(在我的案例中,在大文件上按块拆分文本解析),并且我试图通过对m_numBytesRead-1进行Seek来第二次访问,则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上的一个bug,还是有一些我在那里丢失的东西?有没有人看到类似的问题?

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

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

相关内容

  • 没有找到相关文章

最新更新