2

我正在尝试编写一个代码,它应该能够以任何格式复制文件。目前,我正在尝试 .pdf 格式。这是我编写的代码:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream in("a.pdf", ios::binary);
if(in.fail())
{
    cout<<"\nThe file couldn't be opened\n";
    exit(0);
}

ofstream out("b.pdf", ios::binary);

while(!in.eof())
{
    char buf[1000];
    in.read(buf, sizeof(buf));
    out<<buf;
}
in.close();
out.close();
return 0;
}

现在的问题是重复文件要么被损坏,要么比原始文件小/大。而且也不包含任何文字。我将这段代码用于我的计算机网络项目,在该项目中,我必须以任何格式从服务器向客户端发送文件。

4

1 回答 1

2

我认为发生这种情况是因为您使用operator<<的是输出,它旨在处理格式化字符串,而不是二进制数据。std::ostream.write()read用于二进制/未格式化数据的对应部分。

while(!in.eof())
{
    char buf[1000];
    in.read(buf, sizeof(buf));
    out.write(buf, sizeof(buf));
}

operator<<(char*)可能停在第一个“奇怪的角色”上。即使在文本的情况下,它也不保证输出与输入相同,因为可以使用格式化标志更改格式输出流。

其实我不太确定ios::binaryflag的影响是什么。也许您对它会改变行为感到困惑,operator<<但事实并非如此。我希望它有助于改变缓冲模式或其他东西。

于 2013-11-14T08:49:12.813 回答