1. ホーム
  2. c++

[解決済み] ifstream.good()とbool(ifstream)の違いについて

2022-03-16 22:50:13

質問

テキストファイルからいくつかの変数を取得するプログラムを書いています。 プログラムがEOFを見つけると
は、データの入力を終了します。

int main()
{
    int val, count = 0;
    ifstream fileIn;
    fileIn.open("num.txt");

    fileIn >> val;
    while (fileIn)
    {
        ++count;
        cout << "number: " << val << endl;
        fileIn >> val;
    }
    cout << "count: " << count << endl;

    fileIn.close();
    return 0;
}

num.txt ファイルを作成します。 11 22 33 44

プログラムの出力です。

number: 11
number: 22
number: 33
number: 44
count: 4

すべてOKです。しかし、while conditionセクションを fileIn から fileIn.good() ,
を実行すると、プログラムの出力は次のようになります。

number: 11
number: 22
number: 33
count: 3

最後の値をスキップするようになりました。 なぜこのようなことが起こるのでしょうか? fileIn
fileIn.good() ?

解決方法は?

<ブロッククオート

最後の値をスキップするようになりました。なぜこのようなことが起こるのでしょうか? との違いは fileInfileIn.good() ?

fileIn >> val;
while (fileIn)
{
    ++count;
    cout << "number: " << val << endl;
    fileIn >> val;
}

を指定した場合、その内容は "11 22 33 44" に関連付けられたストリームで fileIn . を使用すると bool(fileIn) 変換演算子 は、ストリームが失敗していないかどうかを返します。ただし eof() はストリームの失敗ではありません。失敗とは、基本的にI/O操作に失敗することです。

というわけで、最後の数字を読み込んだ後 44val . ストリームが失敗していないため、再びループに入る。 count がインクリメントされます。 val が印刷されますが、次の fileIn >> val は失敗します。そして、whileループの条件でテストされ、失敗するとループが終了します。

実行 fileIn.good() リターン false ストリームの state flags が設定されている。具体的には eof , fail そして bad