CStdioFile::GetPosition 在长文件 (15 MB) 上有几个字节错误
CStdioFile::GetPosition on long file (15 MB) is wrong by few bytes
我有以下代码,其想法是逐行读取文本文件并保存当前位置 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
添加打开模式CFile::typeBinary
以获得字节精确偏移。默认模式是文本,它执行换行符转换,这可能会弄乱偏移量。
我有以下代码,其想法是逐行读取文本文件并保存当前位置 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添加打开模式CFile::typeBinary
以获得字节精确偏移。默认模式是文本,它执行换行符转换,这可能会弄乱偏移量。