## 8.1 フラグとは

ストリームがエラー状態、というのはよくあることです。エラーが発生すると、エラーの一般カテゴリによる状態にフラグが設定されます。表 8 に、フラグとそのエラーカテゴリを示します。

#### 表 8 -- フラグと対応するエラーカテゴリ

入出力状態フラグ | エラーカテゴリ
--- | ---
`ios_base::goodbit` | すべて問題なし。
`ios_base::eofbit` | 入力シーケンスの最後まで入力演算が行われました。
`ios_base::failbit` | 目的の文字を入力演算で読み取ることができませんでした。または目的の文字を出力演算で生成することができませんでした。
`ios_base::badbit` | 基本入力シーケンスや出力シーケンスの完全性が失われたことを表します。

フラグ `ios_base::goodbit` は実際にはフラグではなく、エラーフラグがないことを示すゼロの値です。ストリームにエラーがないことを表します。規約上では、ストリーム状態がゼロ以外になると、すべての入出力演算が無効になります。

場合によっては、`eofbit` と `failbit` の両方が設定されることがあります。ただし、この 2 つの意味は異なり、必ずしも同時に発生するわけではありません。入力シーケンスを過ぎても読み取りを行おうとすると、フラグ `ios_base::eofbit` が設定されます。次の 2 つの例は、その典型的な発生例です。

1. 文字単位による抽出の場合は、最後の文字の読み取りが終了しても、ストリームは良好な状態にあり、`eofbit` は設定されません。ただし、続けて抽出を行おうとすると、入力シーケンス終了後の読み取りになり、`eofbit` が設定されます。
2. 文字単位による読み取りではなく、たとえば整数や文字列の抽出の場合、読み取りは常に入力シーケンスの最後を過ぎても行われます。これは、区切り記号が見つかるか、入力シーケンスの最後を認識するまで、入力演算子による文字の読み取りが行われるためです。したがって、入力に `... 912749<eof>` というシーケンスがあって、その整数を抽出すると、`eofbit` が設定されます。

読み取りや書き込み演算が失敗すると、フラグ `ios_base::failbit` が設定されます。たとえば、空白だけを含む入力シーケンスから整数を抽出しようとすると、整数の抽出は失敗し、`failbit` が設定されます。先の例で `failbit` が設定されるかどうかを確認してみます。

1. 最後の抽出可能文字を読み取ると、入力シーケンスの最後を過ぎても抽出演算による読み取りが継続するだけでなく、要求した文字の抽出も失敗します。したがって、`eofbit` の他に `failbit` も設定されます。
2. この場合は状況が異なります。整数の抽出は入力シーケンスの最後まで行われますが、入力演算は失敗せず、目的の整数の読み取りは成功します。したがって、この場合、`eofbit` だけが設定されます。

以上の入出力演算以外に、エラーになる状況があります。たとえば、対応するファイルを開くことができな場合は、ファイルストリームによって `failbit` が設定されます ( 9.2.2 節参照)。

フラグ `ios_base::badbit` は、基本ストリームバッファの問題を表します。次のような問題が考えられます。

- メモリー不足。バッファを作成するだけのメモリーがないか、何らかの理由でバッファのサイズがゼロになっているか6、`iword` や `pword` の場合のようにストリームの内部データ用のメモリーをストリームが割り当てられない7。
- 基本ストリームバッファによって例外が送出される。メモリー不足やコード規約障害、または外部デバイスからのエラー読み取りにより、ストリームバッファの完全性が失われる可能性があります。このように完全性が失われると、ストリームバッファにより例外が送出され、ストリームでそれが捕獲されると、ストリームの状態に `badbit` が設定されます。

一般に、`badbit` は、回復不可能なエラー状態を示しますが、`failbit` が示す状況では失敗した演算をやり直すことができる可能性があります。フラグ `eofbit` は単純に入力シーケンスの最後を示すだけです。

ストリームエラーの検出には、次の 2 通りの方法があります。

- 入出力演算でエラーが発生したら、必ず例外が行われるように宣言する。
- 入出力演算が終了するたびにストリーム状態を検査する。

以上の詳細については、次の 2 つの節で説明します。

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

OEM リリース, 1998 年 6 月