复制文件时,由于以缓冲区为单位复制,一般目的文件总比源文件多一些字节.高手过来看看!谢谢! 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);
{
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);
可惜不能啊! ?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()或叫磁盘文件的读写/异步读写 )能返回实际读取字节数,但不知道这个函数的效率怎样?如果读写的效率高,用它的话本问题就解决了!
iCnt=fread(&bBuff, SIZE, 1, fpSrc );//fread函数要是能返回实际读入的字节数就好解决
改为
iCnt=fread(&bBuff, 1, SIZE, fpSrc );
即可以实现返回实际读入的字节数2. ReadFile 与 fread 在Windows 平台上,效率差不多, fread 最终也会转换为 ReadFile 的调用
iCnt=fread(&bBuff, 1, SIZE, fpSrc );你这么写就肯定对,但缓冲区还是1个字节数据呀,但有多个缓冲区.
这样会不会仍然存在效率问题?