我正在尝试编写一个代码,该代码应该能够以任何格式制作文件的副本。目前,我正在尝试.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;
}
现在的问题是重复文件被破坏或者比原始文件更小/更大。并且也不包含任何文字。 我正在为我的计算机网络项目编写此代码,我必须从服务器向客户端发送任何格式的文件。
答案 0 :(得分: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::binary
旗帜有什么影响。也许你感到困惑的是它会改变operator<<
的行为,但事实并非如此。我希望它有助于改变缓冲模式或其他东西。