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

0 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();

}
Run Code Online (Sandbox Code Playgroud)

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

int*_*jay 5

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

    while (file.read(....))
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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