1

ストリームを含む C++ コースのプログラミングの課題があり、一部の関数がそのように機能する理由をよりよく理解しようとしています。

テキストの後に空白を含む istringstream から入力を読み取っています。出力で最後の単語が繰り返されるのはなぜですか?

istringstream is;
string inputstring = "The cliched statement regarding the big brown dog and foobar or something    ";
string outputstring;
is.str(inputstring);
while (is.good())
{
    is >> outputstring;
    cout << outputstring << endl;
}

そのため、good フラグをループする代わりに、while 条件として抽出を行っています。

while (is >> outputstring)
...

これはうまく機能し、最後の単語を繰り返しません。読み取りが完了したときに while ループから抜け出すこのステートメントについてはどうですか? 抽出は同じストリームへの参照を返しますが、フラグなどをチェックしますか?

すべてのストリームを含めることができる単一のヘッダーはありますか?

4

3 に答える 3

2

読み取りが完了したときに while ループから抜け出すこのステートメントについてはどうですか? 抽出は同じストリームへの参照を返しますが、フラグなどをチェックしますか?

抽出演算子がストリームへの参照を返すことは間違いありません。whileループ (forおよびdo-whileループとステートメント)の制御条件として使用される式ifは、強制的にbool型指定されます。explicit変換としてカウントされるため、ios_base::operator bool()が呼び出され、 が返されます!this->fail()。そして、それがフラグがチェックされる方法です。

于 2012-09-30T16:49:20.737 に答える
1

最後の単語が出力で繰り返されるのはなぜですか?

これが起こります:の終わりにスペースがあるのでinputstring、最後の単語を読んでもgood()ビットは反転しません。プログラムは最後の単語の後にスペース文字を見つけ、さらに単語があると考えて、is.good()それでもを返しますtrueis.good()プログラムが文字列の終わりを超えて読み取ろうとした場合にのみfalseを返します。これはまだ起こっていません。

次に、ループを通過してから読み取るときisに、プログラムは単語がもうないことを認識し、上書きしない ので、最後の単語である前にoutputstringあったものをもう一度書き込みます。outputstring

is.good()から読み取る前後の結果を印刷してみisて、最後のスペース文字を削除して、inputstring何が変わるかを確認してください…</ p>

于 2012-09-30T16:40:52.743 に答える
0

ストリームは良好な状態である可能性があるため、読み取り後に常に確認する必要がありますが、何かを読み取ろうとすると失敗する可能性があります。結局、ストリームはあなたが何を読み取ろうとしているのかを知ることができません。したがって、最後の要素の後のストリームをチェックすると、それはまだgood()です。good()次に、どちらが失敗しているかを読み取ろうとしますがfalse、とにかく値を出力します。

また、ストリームの終わりに達した場合、読み取りが成功した後でもこれが変わる可能性があるため、条件として使用することは望ましくありません。たとえば、番号が読み取られ、ファイルの最後の番号の後に空白がない場合は、が設定されます。次のようなidomaticループを使用してください。.good()falsestd::ios_base::eofbit

while (in >> value) {
    std::cout << "read value='" << value << "'\n";
}

単純すぎて正しくないように見えますが、実際には正しいことをしています!

于 2012-09-30T16:41:53.240 に答える