【发布时间】:2015-03-17 18:49:21
【问题描述】:
我想知道为什么下面的代码没有将正确的数据写入文件。如果我将缓冲区大小更改为更大,则此代码可以正常工作。
对于下面的代码,如果我尝试读取小于 500 字节的文件,效果很好,但对于更大的文件,我必须增加缓冲区。我在阅读循环中缺少什么?
const int iBuffSiz = 500;
char chBuffer[iBuffSiz];
memset(chBuffer, 0, sizeof(chBuffer));
CFile file;
CFile fileO;
if(file.Open(XML_FILE_NAME, CFile::modeRead | CFile::typeBinary) == FALSE)
{
return;
}
if(fileO.Open(XML_FILE_NAME_O, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary) == FALSE)
{
return;
}
while(file.Read(chBuffer, iBuffSiz) > 0)
{
try{
UINT iCount = strlen(chBuffer);
fileO.Write(chBuffer, iCount);
}
catch (CFileException *exp)
{
TCHAR szCause[255];
exp->GetErrorMessage(szCause, 255);
}
}
//Closing file handle and socket after complete file send
file.Close();
fileO.Close();
【问题讨论】:
-
您以 CFile::typeBinary 的形式打开输入文件,但使用 strlen() 来获取任何长度。
-
这有点误导,@plaintext,因为
CFile::typeBinary与这些问题无关。问题在于,无论有没有该标志,OP 都不能保证缓冲区内容是一个以 NUL 结尾的字符串,这是使用strlen()所必需的。相反,检查 CFile 的文档,我认为它可以告诉你它读取了多少字节。最后,还有两个提示:有更好的方法来复制文件(搜索网络!),捕获然后完全忽略异常是非常有害的。