25

次を使用してファイル内の各行を読み取るループがありますgetline()

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

私は、このような呼び出しも機能しているように見えることに気付きましたgetline():

while (getline(is, line))

何が起きてる?getline()ストリーム参照を返します。どういうわけかポインタに変換されていますか?これは実際に良い習慣ですか、それとも最初の形式に固執する必要がありますか?

4

4 に答える 4

27

istreamによって返されるは、そのgetline()オペレーターvoid*()メソッドを暗黙的に呼び出すことで、ストリームでエラーが発生したかどうかを返します。そのため、 への呼び出しよりも多くのチェックを行っていますeof()

于 2008-11-03T17:02:45.743 に答える
8

更新しました:

basic_istream::sentry クラスの operator bool() メソッドのbasic_istream ドキュメントを誤って指摘していましたが、指摘されているように、これは実際に起こっていることではありません。チャールズとリュックの正解に投票しました。実際に呼び出されるのは演算子 void*() です。詳細については、 C++ FAQ を参照してください

于 2008-11-03T17:02:04.980 に答える
5

チャールズは正しい答えを出しました。

と呼ばれるものは実際std::basic_ios::operator void*()には であり、 ではなく、歩哨ではなくa (したがって a ) を返すというsentry::operator bool()事実と一致しています。std::getline()std::basic_istreamstd::basic_ios

非信者については、以下を参照してください。

そうでなければ、他の人がすでに言ったように、標準的な2番目の形式を好みます。fail()本当に冗長なコードが必要な場合はnot を使用してください --xxx.good()の代わりに使用できるかどうかは覚えていません!xxx.fail()

于 2008-11-03T18:01:33.613 に答える
-3

私は最初のフォームに固執します。2 番目の形式は機能する可能性がありますが、ほとんど明示的ではありません。元のコードは、何が行われ、どのように動作することが期待されるかを明確に記述しています。

于 2008-11-03T17:06:37.093 に答える