## 9.1 ファイルストリームとは

ファイルストリームでは、ファイルに対する入出力を行います。ただし、ファイル入出力用の C stdio 関数とは異なり、ファイルストリームは、「資源の収集は初期化である」という Stroustrup のイディオムに準拠しています。10 すなわち、ファイルストリームでは、ストリームの構築時にファイルを開くことができ、ファイルを破棄すると自動的に閉じるという利点があります。以下にコード例を示します。

>     void use_file(const char* fileName)
>     {
>        FILE* f = fopen("fileName", "w");
>        // ファイルを使用する
>        fclose(f);
>     }

ここで、ファイルの使用時に例外が送出されると、ファイルは閉じなくなります。しかし、ファイルストリームの場合は、次の例のようにファイルストリームがなくなるとファイルが閉じます。

>     void use_file(const char* fileName)
>     {
>        ofstream f("fileName");
>        // ファイルを使用する
>     }

ここで、開かれたファイルの使用中に例外が発生すると、ファイルが閉じます。

ファイルストリームを実装するクラステンプレートは、basic_ifstream <charT,traits>、basic_ofstream <charT,traits>、basic_fstream <charT,traits> の 3 つです。これらのテンプレートは、ストリーム基底クラス basic_ios <charT, traits> から派生したものです。したがって、第 7 章で述べたように、ストリームの状態だけでなく、書式設定した入出力の関数はすべて継承します。また、ファイルを開閉する関数や、ファイルを開いてそれをストリームに接続するコンストラクタを備えます。標準定義の `ifstream`、`ofstream`、`fstream`、およびワイド文字ファイルストリーム用の `wifstream`、`wofstream`、`wfstream` もあるので便利です。

バッファ処理は、特殊化されたストリームバッファクラス basic_filebuf <charT,traits> で行います。

### 9.1.1 定義済みストリームとファイルストリームとの違い

定義済みの標準ストリームとファイルストリームとの主な違いは、次のとおりです。

- ファイルストリームはファイルに接続してから使用します。定義済みストリームはすぐに使用することができます。`main()` 関数の呼び出し前に実行する静的コンストラクタの場合でも同じです。
- ファイルストリームは任意のファイル位置に位置を変更することができます。定義済みストリームの場合は、デフォルトで端末に接続されるため、通常は、位置を変更しても意味がありません。

### 9.1.2 ワイド文字ストリームのコード変換

大型の文字セット環境では、ファイルには複数バイト文字を使用します。内部処理の際、そのようなファイルの中身をワイド文字シーケンスとして使用するために、`wifstream` と `wofstream` で必要な変換が行われます。実際の変換はファイルバッファに委託され、ファイルバッファでは組み込まれたロケールのコード規約ファセットにそのタスクを伝達します。

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

OEM リリース, 1998 年 6 月