## 9.3 オープンモード

ファイルの開き方やプログラム内での使用方法の変更が必要になることがあります。たとえば、既存の値に上書きするのをやめて、ファイルの末尾にデータを追加して書き込むように変更する場合などです。ファイルストリームコンストラクタでは、2 番目の引数であるオープンモードを使用することで、 こういった変更内容を指定することができます。次に例を示します。

>     fstream Str("inout.txt",
>                 ios_base::in|ios_base::out|ios_base::app);

### 9.3.1 オープンモードフラグ

オープンモード引数の型は `ios_base::openmode` であり、これは書式フラグやストリーム状態のようなビットマスク型です。表 10 は後続のビットの内容です。

#### 表 10 -- フラグ名と機能

フラグ名 | 機能
--- | ---
`ios_base::in` | ファイルを開いて読み取ります。
`ios_base::out` | ファイルを開いて書き込みます。
`ios_base::ate` | 開始位置はファイルの末尾です。
`ios_base::app` | ファイルに追加します。すなわち、常にファイルの末尾に書き込みます。
`ios_base::trunc` | ファイルを切り捨てます。すなわち、内容を削除します。
`ios_base::binary` | バイナリモード

#### 9.3.1.1 インとアウトのオープンモード

入力 (と出力) ファイルストリームでは、常に `in` (または `out`) オープンモードフラグが暗黙的に設定されます。たとえば、出力ファイルストリームの場合は、出力モードに設定されているため、明示的に出力モードに設定する必要はありません。すなわち、次のようなコードを記述する代わりに、

>     ofstream Str("out.txt",ios_base::out|ios_base::app);

次のコードを使用します。

>     ofstream Str("out.txt",ios_base::app);

これに対して、双方向ファイルストリームではフラグが暗黙的に設定されることはありません。双方向ストリームを、入力モードと出力モードの両方に設定するような状況はないからです。しかし、双方向ストリームを読み取りか、書き込みのいずれかのためだけに開くことがあります。そのため、双方向ファイルストリームには暗黙的な入力モードや出力モードはありません。必要なときは、双方向ファイルストリームのオープンモードを明示的に設定してください。

#### 9.3.1.2 オープンモード ate、app、trunc

各ファイルにはファイル位置があり、次のバイトを読み取ったり、書き込むファイル内の位置を示します。一般に、ファイルを開いたときは、ファイルの先頭が最初のファイル位置になります。オープンモード `ate` (at end (末尾) を表す) と `app` (append (追加) を表す) では、このデフォルトがファイルの末尾に変更されます。

`ate` モードと `app` モードは多少の違いがあります。ファイルを追加モードで開くと、どこにファイル位置を変更していようと、ファイルに対するすべての出力は現在のファイルの末尾で行われます。ファイルの末尾の前に位置を変更していても、そこに書き込むことはできません。`at-end` モードでは、ファイルの末尾より前の位置も検索することができ、そこに書き込むことができます。

既存のファイルを書き込みのために開く場合、通常は、出力ファイルの内容を上書きすることができます。オープンモード `trunc` (truncate (切り捨て) を表す) では、ファイルの初期長がゼロに設定されている場合、ファイルの中身が破棄されます。したがって、ファイルを拡張せずにファイルの内容を置換するには、ファイルは `out|trunc` で開いてください。12 この場合、ファイル位置はファイルの先頭になり、出力ファイルの上書きに適した位置になります。

出力ファイルを拡張するには、末尾モードか追加モードで開きます。この場合、`trunc` フラグが設定されないため、ファイルの内容は残され、ファイルの初期位置はファイルの末尾になります。ただし、`trunc` フラグを追加して設定することも可能で、その場合はファイルの内容は破棄され、空のファイルの末尾に出力されます。

入力モードは、既存のファイルにだけ使用することができます。それ以外は、`failbit` がストリーム状態に設定され、ストリームの構築はできません。書き込みのためにファイルを開こうとして、そのファイルがない場合は、作成されます。ただし、ファイルを作成できない場合は、コンストラクタはエラーになります。

#### 9.3.1.3 バイナリオープンモード

`binary` オープンモードについては、9.4 節を参照してください。

### 9.3.2 オープンモードの組み合わせ

オープンモードを組み合わせることは、C ライブラリ関数 `fopen(name,mode)` のモード引数を使用することと同様のはたらきがあります。 表 11は、テキストファイルにおける可能なオープンモードの組み合わせと、それぞれ同様のはたらきをする C stdio の引数の概要を示したものです。この表にないモードの組み合わせ (`trunc` と `app` など) は無効です。`open()` 演算を試みると失敗します。

#### 表 11 -- オープンモードと対応する C stdio の引数

オープンモード | C stdio の等価 | 機能
--- | --- | ---
`in` | `"r"` | 読み取り専用でファイルを開きます。
`out|trunc` `out` | `"w"` | 既存のファイルがあればゼロ長まで切り詰めます。または、書き込み専用でテキストファイルを作成します。
`out|app` | `"a"` | 追加。ファイルを開くか作成して、ファイル末尾に書き込みます。
`in|out` | `"r+"` | テキストファイルを開いて更新します (読み取りと書き込み)。
`in|out|trunc` | `"w+"` | 既存のファイルがあればゼロ長まで切り詰めます。または、テキストファイルを開いて更新します。
`in|out|app` | `"a+"` | 追加。テキストファイルを開くか作成して、ファイルの末尾に書き込み、更新します。

### 9.3.3 デフォルトのオープンモード

コンストラクタのオープンモードパラメータと、ファイルストリームクラスの `open()` 関数には、デフォルト値があります。表 12 にデフォルトのオープンモードを示します。ここでは、 `basic_ifstream <charT,traits>` に対して、`ifstream` のように略称を使用しています。

#### 表 12 -- デフォルトのオープンモード

ファイルストリーム | デフォルトのオープンモード
--- | ---
`ifstream` | `in`
`ofstream` | `out`
`fstream` | `in|out`

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

OEM リリース, 1998 年 6 月