前節では、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 に、このコピーの作成方法を示します。
rdbuf() で得られたポインタが文字列ストリームに挿入されるとき、ファイルの内容が文字列ストリームのバッファに書き込まれます。文字列ストリームの関数 str() を呼び出すと、2 番目のコピーが作成されます。21 文字列の関数 data() では、次のコピーはまだ作成されていません。ただし、文字列の内部データまでのポインタが返ります。
Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月