12

私はいつも読んでいて、バイナリファイルを扱うときは、フォーマットされたデータで使用するためのものであるため、 << および >> 演算子ではなく read() および write() を使用する必要があると言われています。それらを使用できることも読みましたが、それは高度なトピックであり、誰も飛び込んで議論している場所を見つけることができません。

最近、次のことを行うコードを見ました。

std::ifstream file1("x", ios_base::in | ios_base::binary);
 std::ofstream file2("y", ios_base::app | ios_base::binary);

 file1 << file2.rdbuf();

バイナリ ファイルでの << 演算子の使用を指摘したとき、rdbuf() 呼び出しは streambuf * を返し、 << は streambuf* をオーバーロードし、書式設定なしで直接コピーを行うので安全であると言われました。

これは真実で安全ですか?効率はどうですか?落とし穴はありますか?詳細をいただければ幸いです。

ありがとう!

4

3 に答える 3

4

はい (27.6.2.5.3/6 を参照してください。ここでは、streambuf の << のオーバーロードが説明されています)。

于 2009-08-14T14:56:55.060 に答える
3

ストリームをコピーするのは完全に安全で合理的​​な方法です。

次のようなものも許可されることに注意してください。

std::ifstream file_in1("x1", ios_base::in | ios_base::binary);
std::ifstream file_in2("x2", ios_base::in | ios_base::binary);
std::ofstream file_out("y", ios_base::app | ios_base::binary);

file_out << file_in1.rdbuf() << "\nand\n" << file_in2.rdbuf();
于 2009-08-14T14:59:37.833 に答える
1

C ++標準の§27.7.3.6.3では、 §27.7.3.7が基本的にバイナリコピーである「フォーマットされていない入力」について説明していると述べられています。これは、「フォーマットされていない」ostream関数がバイナリデータに対して安全であることを意味します。私が見つけることができる標準で言及されている他の「フォーマットされていない」関数は、、および(公式に)です。
basic_ostream<charT,traits>& operator<< (basic_streambuf<charT,traits>* sb);
Effects: Behaves as an unformatted output function (as described in 27.7.3.7, paragraph 1).

putwriteflush

于 2011-09-21T15:40:49.443 に答える