C++ 长文件(15 MB)上的GetPosition错误数字节
我有以下代码,其中的想法是逐行读取文本文件并保存当前位置m_numbytes读取。因此,如果我打破循环(在我的案例中,通过大文件上的块来拆分文本解析),并尝试通过查找m_numBytesRead-1来进行第二次访问,ReadString就不会像我预期的那样获得行的开头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
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来写文件。