## 13.4 ストリームバッファのコピー

前節では、`rdbuf()` 関数でファイルの内容をそのまま読み取る方法を説明しました。この節では、別の方法を説明します。ファイルを追加する前に解析をしなければならないような、ヘッダー情報を持ったファイルがあるとします。また、現在のファイルの内容を、標準出力ストリームに書き込まずに、追加前に内容を処理するものとします。この場合、後処理のためにファイルの内容をそのままメモリーに書き込むには、文字列ストリームを作成して、ファイルのストリームバッファを文字列ストリームに挿入する方法が最も簡単です。

>     fstream fil("/tmp/inout");
>       stringstream header_stream;                                 //1
>       header_stream << fil.rdbuf();                               //2

>       // ヘッダーなどを処理する
>       string word;
>       header_stream >> word;                                      //3

//1 | 後処理のためにファイルの内容をそのままメモリーに書き込む方法として、最も簡単なのは文字列ストリームを作成し、
//2 | ファイルのストリームバッファを文字列ストリームに挿入する方法です。
//3 | これで、`operator>>()`、`read()`、`get()` などに匹敵するヘッダー情報の読み取り、解析用の入力ストリームの一般的な機能ができました。

この方法で不十分な場合は、ヘッダー情報を組み込んだ文字列を作成し、文字列演算 `find()`、`compare()` などで処理します。

>     fstream fil("/tmp/inout");
>       header_stream << fil.rdbuf();
>       string header_string = header_stream.str();

>       // ヘッダーなどを処理する
>       string::size_type pos = header_string.rfind('.');

テキストデータの代わりにバイナリデータがヘッダーにある場合は、文字列でも不十分です。すなわち、通常の `char*` バッファなどの、単なるバイトシーケンスのヘッダーが必要な場合です。ただし、ファイルストリームに対応するロケールによっては、すでにコード変換が行われている可能性もあります。バイナリデータを処理する場合、対応するロケールに非変換コード変換ファセットがあることを確認してください。

>     fstream fil("/tmp/inout");
>       header_stream << fil.rdbuf();
>       string header_string = header_stream.str();
>       const char* header_char_ptr = header_string.data();

>       // ヘッダーなどを処理する
>       int idx;
>       memcpy((char*) &idx,header_char_ptr,sizeof(int));

効率上の注意: ヘッダー情報の範囲が広い場合、前の例ではコピー演算の数量を考慮する必要があります。図 35 に、このコピーの作成方法を示します。

#### 図 35 -- ファイル内容のコピー

`rdbuf()` で得られたポインタが文字列ストリームに挿入されるとき、ファイルの内容が文字列ストリームのバッファに書き込まれます。文字列ストリームの関数 `str()` を呼び出すと、2 番目のコピーが作成されます。21 文字列の関数 `data()` では、次のコピーはまだ作成されていません。ただし、文字列の内部データまでのポインタが返ります。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。

OEM リリース, 1998 年 6 月