2017-01-29 5 views
4

私はテキストファイルからいくつかの変数を取るプログラムを書いています。 プログラムがEOFを検出すると、
はデータの入力を終了します。ifstream.good()とbool(ifstream)の違い

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です。私はfileInからfileIn.good()にwhile条件のセクションを変更した場合でも、
プログラムの出力は次のようになります。それは今、最後の値をスキップし

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

。 なぜこれが起こっているのですか。fileIn
fileIn.good()の違いは何ですか?

+0

http://en.cppreference.com/w/cpp/io/basic_ios/good – chris

答えて

4

最後の値をスキップします。これがなぜ起こり、 の違いがfileInfileIn.good()の間にあるのですか? fileInに関連付けられたストリームで"11 22 33 44"の所与のコンテンツについて

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

bool(fileIn)conversion operatorを使用すると、ストリームに障害が発生していないかどうかが返されます。 eof()に達することはストリームの失敗ではありません。障害は基本的にI/O操作が失敗したときです。

最後の数字44valに読み込んだ後、ストリームに障害が発生していないため、ループは再び入力されます。countがインクリメントされ、valが出力されますが、次のfileIn >> valは失敗します。それはwhileループの状態でテストされ、失敗するとループが終了します。

Doing fileIn.good()は、ストリームのいずれかがstate flagsに設定されている場合、falseを返します。具体的には、eoffailbad

if (fileIn)
2

badbit又はfailbitrdstate()に設定されている場合にtrueを返しif (!fileIn.fail())、と等価です。

一方、fileIn.good()は、rdstate()が0に等しいかどうかをチェックします。したがって、fail()に加えて、eofbitのフラグもチェックします。

最後の値をスキップします。これが起こっている理由と、fileIn とfileIn.good()の違いは何ですか?

あなたがvalを読んでいるので、その後while(fileIn.good())を使用してストリームの状態を確認してから出力後、fileIneofbitセットを持っているので、見たことはありません最後の値、。上記のようにif(infs)でチェックされていません。

関連する問題