#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。为什么呢?
答案 0 :(得分:5)
您永远不想使用看起来像while (!file.eof())
的循环。而是检查读取操作是否成功,例如用:
while (file.read(....))
eof标志可能只能由下一次读取操作设置,因此在阅读之前检查它是没有用的。
您始终将完整缓冲区写入输出文件,但read
可能只读取缓冲区的一部分。使用file.gcount()
查看已读取的字节数。
请注意,缓冲区大小不需要与文件大小相同 - 这对于不适合内存的文件不起作用。您可以简单地使用恒定大小的缓冲区。循环将负责复制整个文件。