C++ 长文件(15 MB)上的GetPosition错误数字节

C++ 长文件(15 MB)上的GetPosition错误数字节,c++,mfc,cfile,C++,Mfc,Cfile,我有以下代码,其中的想法是逐行读取文本文件并保存当前位置m_numbytes读取。因此,如果我打破循环(在我的案例中,通过大文件上的块来拆分文本解析),并尝试通过查找m_numBytesRead-1来进行第二次访问,ReadString就不会像我预期的那样获得行的开头 CStdioFile fileLog; if (fileLog.Open(m_strReadFileName, CFile::modeNoTruncate | CFile::modeRead | CFile::shareDenyN

我有以下代码,其中的想法是逐行读取文本文件并保存当前位置m_numbytes读取。因此,如果我打破循环(在我的案例中,通过大文件上的块来拆分文本解析),并尝试通过查找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上有bug还是我遗漏了什么?有人看到类似的问题吗



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

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

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

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

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

Hmmm。。。显然,我并不孤单。缓冲区不是我的解决方案(太大的文件):它不是带有BOM表的Unicode文本文件,是吗?另外,不要忘记,
CStdioFile
对回车换行符对进行了特殊处理,因此您在磁盘上看到的可能不是您最终读取的内容。我怀疑问题在于单个
0x0A'或
0x0D`换行符;CSTDIO文件可能在内部将它们转换为一对
0x0A0D
,而无需调整位置/计数器。感谢您的提示。回答您的问题:-在我的案例中不是Unicode文本文件-行结尾总是CR+LF,通过投入更多,GetPosition()似乎是基类1(CFile)并表示“输入缓冲区二进制”,它似乎读取的字符比搜索行结尾所需的字符多一点(CSTDOIFILE)。这只是一个暗示,我没有证据。所以我不得不用另一种方法来保住这个职位…感谢弗拉德·范斯坦,他是唯一的LF。我用CFile而不是CStdioFile来写这个文件。。。显然,我并不孤单。缓冲区不是我的解决方案(太大的文件):它不是带有BOM表的Unicode文本文件,是吗?另外,不要忘记,
CStdioFile
对回车换行符对进行了特殊处理,因此您在磁盘上看到的可能不是您最终读取的内容。我怀疑问题在于单个
0x0A'或
0x0D`换行符;CSTDIO文件可能在内部将它们转换为一对
0x0A0D
,而无需调整位置/计数器。感谢您的提示。回答您的问题:-在我的案例中不是Unicode文本文件-行结尾总是CR+LF,通过投入更多,GetPosition()似乎是基类1(CFile)并表示“输入缓冲区二进制”,它似乎读取的字符比搜索行结尾所需的字符多一点(CSTDOIFILE)。这只是一个暗示,我没有证据。所以我不得不用另一种方法来保住这个职位…感谢弗拉德·范斯坦,他是唯一的LF。我用CFile而不是CStdioFile来写这个文件。。。显然,我并不孤单。缓冲区不是我的解决方案(太大的文件):它不是带有BOM表的Unicode文本文件,是吗?另外,不要忘记,
CStdioFile
对回车换行符对进行了特殊处理,因此您在磁盘上看到的可能不是您最终读取的内容。我怀疑问题在于单个
0x0A'或
0x0D`换行符;CSTDIO文件可能在内部将它们转换为一对
0x0A0D
,而无需调整位置/计数器。感谢您的提示。回答您的问题:-在我的案例中不是Unicode文本文件-行结尾总是CR+LF,通过投入更多,GetPosition()似乎是基类1(CFile)并表示“输入缓冲区二进制”,它似乎读取的字符比搜索行结尾所需的字符多一点(CSTDOIFILE)。这只是一个暗示,我没有证据。所以我不得不用另一种方法来保住这个职位…感谢弗拉德·范斯坦,他是唯一的LF。我用CFile而不是CStdioFile来写这个文件。。。显然,我并不孤单。缓冲区不是我的解决方案(太大的文件):它不是带有BOM表的Unicode文本文件,是吗?另外,不要忘记,
CStdioFile
对回车换行符对进行了特殊处理,因此您在磁盘上看到的可能不是您最终读取的内容。我怀疑问题在于单个
0x0A'或
0x0D`换行符;CSTDIO文件可能在内部将它们转换为一对
0x0A0D
,而无需调整位置/计数器。感谢您的提示。回答您的问题:-在我的案例中不是Unicode文本文件-行结尾总是CR+LF,通过投入更多,GetPosition()似乎是基类1(CFile)并表示“输入缓冲区二进制”,它似乎读取的字符比搜索行结尾所需的字符多一点(CSTDOIFILE)。这只是一个暗示,我没有证据。所以我不得不用另一种方法来保住这个职位…感谢弗拉德·范斯坦,他是唯一的LF。我用CFile而不是CStdioFile来写文件。