文法:
bool istream::eof();
eof()関数は、関連する入力ファイルが終端に達していたらtrueを、そうでなければfalseを返します。
終端を超えて文字を読みに行こうとすると、ストリームはEOF状態になります。>>演算子やgetlineは通常、トークンの終了(ホワイトスペース、無効な文字、改行、EOF)まで文字列を読みに行きますが、正しく読み込まれたとしても、EOFフラグがセットされる可能性はあります。最後のトークンの後ろにホワイトスペースがある場合にはEOFはセットされませんが、もう一度読み込もうとすると失敗します。
そのため、EOFフラグは、ストリームの内容をEOFまですべて読み込んだかどうかというのをループ内で判定するような用途には使えません。
ファイルの最後まで読み込めたかを確認するのであれば、次のようにストリーム自身を比較するようにしましょう:
std::ifstream file("test.txt"); std::string line; while (std::getline(file, line)) { // ラインが正常に読み込めたら、ここで処理することができます。 }
次のサンプルの7行目は、EOF状態を確認する主な使い方を説明しています。よく使うのは、読み込みに失敗した後の判断です。このような状況の時に、ストリームの終端に達したのが失敗の原因かどうかを把握するのに使用されます。
1: std::ifstream file("test.txt"); 2: std::string word; 3: double value; 4: while (file >> word >> value) { 5: // 単語とdoubleが両方とも正しく読み込めた 6: } 7: if (!file.eof()) throw std::runtime_error("ファイルのデータが不正です。");
次の表は、ストリームがなりうる状態をまとめています:
| テスト方法 | 説明 |
|---|---|
| if (s) | 前の操作が成功した(!s.fail()の短縮形) |
| if (s.fail()) | 前の操作が失敗した |
| if (s.eof()) | 過去の読み込みが終端に達した |
| if (s.bad()) | ストリームの状態が未定義。このストリームはこれ以上使用不可 |
| if (s.good()) | bad/eof/failがどれも設定されていない |