使用write()复制二进制文件,复制文件的大小增加

时间:2012-08-05 14:14:45

标签: c++ binaryfiles

#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。为什么呢?

1 个答案:

答案 0 :(得分:5)

  1. 您永远不想使用看起来像while (!file.eof())的循环。而是检查读取操作是否成功,例如用:

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

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

  2. 您始终将完整缓冲区写入输出文件,但read可能只读取缓冲区的一部分。使用file.gcount()查看已读取的字节数。

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