问题是CFile::Read()
它不能保证它读取的数据与您要求的一样多。有时它读取的内容更少,并且让您的缓冲区没有空终止符。您必须假设每次读取调用可能只获得一个字节。当一个不可读的内存块紧跟着你的缓冲区时,这有时也会崩溃。
您需要继续阅读该文件,直到读完为止。此外,空终止符通常根本不会写入文件,因此您不应该假设它会被读入,而是要确保无论读取什么内容,您的缓冲区始终是空终止的。
此外,您不应该使用文件大小作为缓冲区大小;没有理由认为您可以一次阅读所有内容,并且文件大小可能很大或为零。
您还应该避免手动内存管理,而不是new[]
/ delete[]
,使用向量,这将确保您不会忘记释放缓冲区或使用delete
而不是delete[]
,并且即使在发生异常的情况下也会释放内存。(就此而言,我不建议使用CString
or CFile
,但这是另一个话题......)
// read from the current file position to the end of
// the file, appending whatever is read to the string
CString ReadFile(CFile& somefile, CString& result)
{
std::vector<char> buffer(1024 + 1);
for (;;)
{
int read = somefile.Read(&buffer[0], buffer.size() - 1);
if (read > 0)
{
// force a null right after whatever was read
buffer[read] = '\0';
// add whatever was read to the result
result += &buffer[0];
}
else
{
break;
}
}
}
请注意,此示例中没有错误处理。