ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C++ ユーザーズガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
13.4.1 クラス fstream を使用したファイル操作
13.4.1.2 ファイルを指定しない fstream の宣言
13.4.1.4 ファイル記述子を使用したファイルのオープン
入力や出力のシステムは、フォーマットを行う iostream と、システムのほかの部分は streambuf ストリームからなります。これはフォーマットなしの文字ストリームの入力または出力で動作します。
streambuf ストリームは通常、iostream 経由で使用するため、詳細に知っておく必要はありません。 streambuf ストリームを直接使用するように選択できます。たとえば、効率を高める場合や、iostream に組み込まれたエラー処理または整形を回避することが必要な場合があります。
streambuf は文字シーケンス (文字ストリーム) と、シーケンス内を指す 1 つまたは 2 つのポインタとで構成されています。各ポインタは文字と文字の間を指しています。(ポインタは実際には文字と文字の間を指しているわけではありませんが、このように考えると理解しやすくなります。)streambuf ポインタには次の種類があります。
streambuf は、このどちらかのポインタ、または両方のポインタを持ちます。
ポインタ位置の操作とシーケンスの内容の操作にはさまざまな方法があります。操作時に両方のポインタが移動するかどうかは、使用される streambuf の種類によって違います。一般的に、キュー形式の streambuf ストリームの場合、get ポインタと put ポインタは別々に移動します。ファイル形式の streambuf ストリームの場合、get ポインタと put ポインタは同時に移動します。キュー形式ストリームの例としては strstream があり、ファイル形式ストリームの例としては fstream があります。
ユーザーは streambuf オブジェクト自体を作成することはなく、streambuf クラスから派生したクラスのオブジェクトを作成します。例としては、filebuf と strstreambuf があります。これらについては filebuf(3CC4) と ssbuf(3) のマニュアルページを参照してください。より高度な使い方として、独自のクラスを streambuf から派生させて特殊デバイスのインタフェースを提供したり、基本的なバッファリング以外のバッファリングを行なったりすることができます。sbufpub(3CC4) と sbufprot のマニュアルページ (3CC4) では、これを行う方法について説明します。
独自の特殊な streambuf を作成する以外にも、マニュアルページで説明しているように、iostream と結合した streambuf にアクセスして公開メンバー関数にアクセスする場合があります。また、各 iostream には、streambuf へのポインタを引数とする定義済みの挿入子と抽出子があります。streambuf を挿入したり抽出したりすると、ストリーム全体がコピーされます。
次の例では、以前説明したファイルコピーを実行する別の方法を示しています。簡潔にするためにエラーチェックは省略されています。
ifstream fromFile("thisFile"); ofstream toFile ("thatFile"); toFile << fromFile.rdbuf();
入力ファイルと出力ファイルは、前と同じようにオープンします。各 iostream クラスにはメンバー関数 rdbuf があり、それに結合した streambuf オブジェクトへのポインタを返します。fstream の場合、streambuf オブジェクトは filebuf 型です。fromFile に結合したファイル全体が toFile に結合したファイルにコピー (挿入) されます。最後の行は次のように書くこともできます。
fromFile >> toFile.rdbuf();
前述の書き方では、ソースファイルが抽出されて目的のところに入ります。どちらの書き方をしても、結果はまったく同じになります。