0

我有以下代码,其想法是逐行读取文本文件并保存当前位置 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。

4

1 回答 1

3

添加开放模式CFile::typeBinary以获取字节精确的偏移量。默认模式是文本,它执行可能会弄乱偏移量的换行符转换。

于 2015-10-05T08:09:43.800 回答