复制文件时,由于以缓冲区为单位复制,一般目的文件总比源文件多一些字节.高手过来看看!谢谢!    if((fpSrc=fopen(m_oldPathName,"rb"))==NULL)
    {
 AfxMessageBox("不能打开源文件!");
 return;
    }
    if((fpDest=fopen(m_newPathName,"wb+"))==NULL)
    {
 AfxMessageBox("不能建立新文件!");
 return;
    }
    do
    {
    memset(&bBuff, 0, SIZE);
        fread(&bBuff, SIZE, 1, fpSrc );
        fwrite( &bBuff, SIZE, 1, fpDest );
     } while( !feof(fpSrc) );
 
     fclose(fpSrc);
     fclose(fpDest);

解决方案 »

  1.   

    read函数要是能返回实际读入的字节数就好解决了!
    可惜不能啊!    ?do
        {
    iCnt=0;
    memset(&bBuff, 0, SIZE);
            iCnt=fread(&bBuff, SIZE, 1, fpSrc );//fread函数要是能返回实际读入的字节数就好解决了! ?
         if( iCnt < 150 )
    {
       bChk=true;
       break;
    }
             fwrite( &bBuff, 150, 1, fpDest );//最后一次按实际读取字节数写入
          } while( !feof(fpSrc) );

          if(bChk)
          {
            fwrite( &bBuff, iCnt, 1, fpDest );
          }其他解决方案探讨:
    (1)如果用fputc()和fgetc()函数,一个一个字符读写就不会出现这样的问题了.但这样读写效率底.
       本问题的原因是一次读SIZE=100个字符.最后一次通常不占满整个缓冲区,但写的时候
    是按整个缓冲区写的,导致了目的文件总比源文件多一些字节 .
    (2)有一组读串口的函数ReadFile()(WriteFile()或叫磁盘文件的读写/异步读写 )能返回实际读取字节数,但不知道这个函数的效率怎样?如果读写的效率高,用它的话本问题就解决了!
      

  2.   

    1. 用法不对:        
    iCnt=fread(&bBuff, SIZE, 1, fpSrc );//fread函数要是能返回实际读入的字节数就好解决
    改为
    iCnt=fread(&bBuff, 1, SIZE, fpSrc );
    即可以实现返回实际读入的字节数2. ReadFile 与 fread 在Windows 平台上,效率差不多, fread 最终也会转换为 ReadFile 的调用
      

  3.   


       iCnt=fread(&bBuff, 1, SIZE, fpSrc );你这么写就肯定对,但缓冲区还是1个字节数据呀,但有多个缓冲区.
        这样会不会仍然存在效率问题?