首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MFC CFile的文件读写

使用MFC CFile的文件读写
EN

Stack Overflow用户
提问于 2015-03-18 02:49:22
回答 2查看 9.4K关注 0票数 3

我想知道为什么下面的代码不能将正确的数据写入文件。如果我将缓冲区大小更改为更大的值,则此代码可以正常工作。

对于下面的代码,如果我试图读取小于500字节的文件,它工作得很好,但对于更大的文件,我必须增加缓冲区。我在阅读循环中遗漏了什么?

代码语言:javascript
复制
  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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-18 13:48:54

CFile::Read不会空终止缓冲区,因此缓冲区的strlen可以大于缓冲区,它会运行到缓冲区溢出。有一种方法可以解决这个问题,但strlen仍然不能处理二进制文件,这一次缓冲区被削减得太短了。所以最好使用CFile::Read返回的值

代码语言:javascript
复制
UINT iCount;
while( ( iCount = file.Read(chBuffer, iBuffSiz) ) > 0 )
{
   try
   {
      fileO.Write(chBuffer, iCount);
   }
   catch (CFileException *exp)
   {
      TCHAR szCause[255];
      exp->GetErrorMessage(szCause, 255);
   }
}
票数 3
EN

Stack Overflow用户

发布于 2015-03-18 22:10:58

同意Barmark的观点,即CFile::Read返回的计数可能超过指定的缓冲区大小

我的ONe更多的一点是

*您需要在将其写入另一个文件后清除缓冲区,因为它指向您已写入目标文件的字符串,因此您可能无法获得所需文件的精确副本。

代码语言:javascript
复制
  while(file.Read(chBuffer, iBuffSiz-1) > 0)
  {
    try{
      UINT iCount = strlen(chBuffer);
      fileO.Write(chBuffer, iCount);
      memset(chBuffer, 0, sizeof(chBuffer));
    }
    catch (CFileException *exp)
    {
      TCHAR szCause[255];
      exp->GetErrorMessage(szCause, 255);
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29107331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档