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::binary実際、フラグの影響が何であるかはよくわかりません。の動作が変わると混乱したかもしれませoperator<<んが、そうではありません。バッファリングモードなどを変更すると役立つと思います。

于 2013-11-14T08:49:12.813 に答える