0
#include<fstream.h>
#include<conio.h>
#include<alloc.h>

class profile
{
   public: char *copyBytes;
}p;

void main()
{
   unsigned int size;

   fstream file ("file.mp3", ios::binary | ios::in | ios::out);
   fstream copy ("copy.mp3", ios::binary | ios::in | ios::out);
   file.seekg(0, ios::end);
   size=file.tellg();
   file.seekg(0);

   while(!file.eof())
   {
    p.copyBytes=(char*)malloc(size);
    file.read((char*)p.copyBytes, size);
    copy.write((char*)p.copyBytes, size);
    free(p.copyBytes);
   }

   file.close();

}

该程序会复制二进制文件 file.mp3。原始二进制文件 (file.mp3) 为 2.13 MB,复制文件 (copy.mp3) 为 2.14 MB。为什么?

4

1 回答 1

5
  1. 你永远不想使用看起来像while (!file.eof()). 相反,检查读取操作是否成功,例如:

    while (file.read(....))
    

    eof 标志可能仅由下一次读取操作设置,因此在读取之前检查它是没有帮助的。

  2. 您总是将完整的缓冲区写入输出文件,但read可能只读取缓冲区的一部分。用于file.gcount()查看读取了多少字节。

请注意,缓冲区大小不需要与文件大小相同 - 这不适用于不适合内存的文件。您可以简单地使用恒定大小的缓冲区。循环将负责复制整个文件。

于 2012-08-05T14:22:00.440 回答