何も読み取れなかった場合は、failbit
を設定します。ただ、もし条件にストリームをテストし、ビットをクリア:
if(!getline(std::cin, myline)) {
std::cin.clear();
std::cout << "you should enter something" << std::endl;
}
内部的には、シーケンスは、あなたのケースでは、このようです:文字列の端末上
- 待ちます。ターミナルは、ユーザーが改行を発行するまでブロックされます。考えられる2つの可能なエラーケース
- ユーザーはすぐにEOFを押します。これにより、
getline
は何も読み取られず、failbit
とeofbit
が設定されます。
- ユーザーは何かを入力してからEOFを押します。これにより、
getline
は何かを消費し、次の文字を取得しようとしているときにEOFをヒットします。これにより、eofbit
が設定されます。
- もう一度お読みになります。抽出機能は、タイプが
istream::sentry
のオブジェクトを作成し、ストリームの状態をチェックします。エラービットのいずれかが設定されていると、抽出機能がただちに戻るようになります。その前に無限ループが起こった。
clear()
を呼び出すと、すべてのエラービットがクリアされます。また、あなたの情報をもう一度読むことができます。可能な解決策として記載された()cin.clearを使用して他の回答では、
while (cin)
{ int x;
cin >> x;
if (cin) a.push_back(x);
}
それはまだできません。理由はわかりませんが、自分のアカウントでログインしましたが、私は新しいアカウントを取得しました。 -/ –
@mitsuhiko多分、別のopenidアカウントを使用してログインしました。 –
アカウントを取り戻しました。 stackoverflowsのようなOpenIDデリゲートのサポートは少しバグです –