2009-03-23 7 views
2

私は、Pythonコンソール/ irbの動作と同様に、対話型シェルを実装したアプリケーションを持っています。問題は現在、ユーザーが誤って^DにEOFが発行され、私のgetline()呼び出しが空の文字列を返して、 "入力なし"として処理し、再度プロンプトを表示するという問題があります。C++のstd :: cinでEOFを無視する

この場合、プロンプトが表示されます。

私はこの問題をEOFErrorを捕まえて解決しますが、C++では例外は発生せず、catchすることができ、cinにEOFを無視する設定がないようです。

ヒント

答えて

3

litbへの正しい解決策のおかげ:

if (!getline(std::cin, str)) { 
    std::cin.clear(); 
    std::cout << std::endl; 
} 
+0

それはまだできません。理由はわかりませんが、自分のアカウントでログインしましたが、私は新しいアカウントを取得しました。 -/ –

+0

@mitsuhiko多分、別のopenidアカウントを使用してログインしました。 –

+0

アカウントを取り戻しました。 stackoverflowsのようなOpenIDデリゲートのサポートは少しバグです –

1

getline()機能は以下のビット使用してエラーを知らせる:

  • eofbit
  • failbit
  • badbitを

を続行する前にこれらをチェックしてみます。

+0

私はそれらを確認することができますが、私はそのようにEOFを無視することはできません。だから、私は入力ストリームを使い続けることができません。私は自分が望んでいないアプリケーションを終了することができました。 –

+0

ダーニット、あなたは1分で私を打ち負かしました:) +1 –

+0

あなたは試しましたか?cin.clear(); ? – dirkgently

7

何も読み取れなかった場合は、failbitを設定します。ただ、もし条件にストリームをテストし、ビットをクリア:

if(!getline(std::cin, myline)) { 
    std::cin.clear(); 
    std::cout << "you should enter something" << std::endl; 
} 

内部的には、シーケンスは、あなたのケースでは、このようです:文字列の端末上

  • 待ちます。ターミナルは、ユーザーが改行を発行するまでブロックされます。考えられる2つの可能なエラーケース
    1. ユーザーはすぐにEOFを押します。これにより、getlineは何も読み取られず、failbiteofbitが設定されます。
    2. ユーザーは何かを入力してからEOFを押します。これにより、getlineは何かを消費し、次の文字を取得しようとしているときにEOFをヒットします。これにより、eofbitが設定されます。
  • もう一度お読みになります。抽出機能は、タイプがistream::sentryのオブジェクトを作成し、ストリームの状態をチェックします。エラービットのいずれかが設定されていると、抽出機能がただちに戻るようになります。その前に無限ループが起こった。

clear()を呼び出すと、すべてのエラービットがクリアされます。また、あなたの情報をもう一度読むことができます。可能な解決策として記載された()cin.clearを使用して他の回答では、

while (cin) 
{ int x; 
    cin >> x; 
    if (cin) a.push_back(x); 
} 
0

http://www.horstmann.com/cpp/pitfalls.html

あなたはのようなコードを使用することができます参照してください。

別のトリックは、Ctrl + Dを直接処理できるように端末を別のモードに設定することで、コンソールからの入力を標準的な標準よりも処理することです。RAWモードなどでは、ユーザー側(Ctrl + DまたはCtrl + Cなど)からの入力と制御シーケンスへのより直接的なアクセスは、もは​​やelselで処理されません。あなたはより多くの情報を収集する(あるいは時間をコーディング保存)しようとするかもしれ

いくつかのライブラリ:(非常に強力です)

½あなたの問題に関するいくつかの情報は、文書hereにあります。

+0

私はそれがどのように説明された問題を解決するのか分かりません。 – ypnos

+0

@ypnosこのコードは解決策ではなく、一例に過ぎません。とにかく、我々は今、ソリューションを持っています、Litbのおかげで –

関連する問題