3

重複の可能性:
ループ条件内のiostream :: eofが間違っていると見なされるのはなぜですか?


非常に簡単な質問があります...

#include<iostream>
using namespace std;
int main()
{
    char x;
    while(!cin.eof())
    {
        cin>>x;
        cout<<"char: "<< x << endl;
    }
    return 0;
}


Linuxでこのコードを実行しようとすると、次のようになります
。./file_name <test_file.txt
結果は次のとおりです。char:
a char
:b
char:c
char:d
char:
dtest_file.txtが
abcdのみの場合

4

3 に答える 3

10

入力操作に失敗すると、ファイルの終わりが検出されます。

だから、

    cin>>x;
    cout<<"char: "<< x << endl;

入力操作が失敗した場合でも、出力ステートメントが実行されます。

そして、それが失敗したとき、それは更新されませんx

テストする代わりに.eof()、テストし.fail()ます。

これを行うには、ストリームオブジェクトを条件として直接使用します。

#include<iostream>
using namespace std;
int main()
{
    char x;
    while( cin >> x )
    {
        cout<<"char: "<< x << endl;
    }
}

ここで、式cin >> xは更新する可能性のある入力操作を実行し、xその式の結果として、ストリームへの参照、つまり。への参照を返しますcin。そのcinため、条件として直接使用されています。これにより、ブール値への変換が呼び出されます。ブール値は、それ自体がと同等になるように定義されます!cin.fail()(つまり、cin >> x条件としての式は、書き込み!(cin >> x).fail()または、コンマ式としての式と同等(cin >> x, !cin.fail())です)。

于 2012-11-12T12:53:18.977 に答える
2

ファイルから読み取るために少し間違ったパターンを使用しています。正しい形式は

while(cin >> x) {
    cout<<"char: "<< x << endl;
}

入力の終わりを超えて読み込もうとしたかどうかをeof示すことを覚えておいてください; ちょうどそうしようとしているかどうかはわかりません。元のコードは初めてを読み取り、最後から読み上げようとしていないことを確認してから、もう一度読み込もうとします。この読み取りは失敗しますが、ループ内にあり、前の反復の値を持っているため、もう一度出力されます。dxd

上記のコードは、 ;への読み込みを試みたのストリームの状態(偶然にもファイルの終わりだけでなくエラーもキャッチします)をテストします。xしたがって、最初の読み取りが失敗した後は、ループはまったく実行されません。

于 2012-11-12T12:51:04.457 に答える
-1

null文字を避けるために、ファイルサイズのforループを使用する必要があります

于 2012-11-12T13:19:06.227 に答える