質問

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

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

このように getline()を呼び出すことも機能するように見えることに気付きました:

while (getline(is, line))

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

役に立ちましたか?

解決

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

他のヒント

更新:

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

チャールズは正解を返しました。

実際に呼び出されるのは std :: basic_ios :: operator void *()であり、 sentry :: operator bool()ではなく、事実と一致しています。 std :: getline()は、歩ryではなく、 std :: basic_istream (したがって、 std :: basic_ios )を返します。

信者でない人については、以下を参照してください:

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top