2017-07-10 4 views
0

最初のwhileループが実行され、終了するために番号を入力するまで実行されません。その後、while(cin >> cel)の代わりに実行されると、スキップされ、プログラムの終了/終了が導かれます。私は成功を伴わない別の似たような質問に記載されているように、 "シンビット"をクリアすることを含め、すべてを試しました。私は間違って何をしていますか?連続してwhile(cin >> input)を使用する

int main() { 
    double fah = 0; 
    cout << "Enter a fahrenheit value:\n"; 
    while (cin >> fah) { // executes until a non-number input is entered 
     cout << fah << "F == " << fah_to_cel(fah) << "C\n"; 
    } 
    // tried cin.clear(); here 
    // tried cin.clear(ios_base::eofbit); here 
    double cel = 0; 
    cout << "Enter a celcius value:\n"; 
    while(cin >> cel) { // executes until a non-number input is entered 
     cout << cel << "C == " << cel_to_fah(cel) << "F\n"; 
    } 
    return 0; 
} 
+0

エラーフラグをリセットするには 'clear()'し、改行を含む以前の入力を破棄するには 'ignore()'します。重複した質問をリンクします... – Blastfurnace

答えて

2

cin.clear()に電話してください。これにより、エラーフラグcinがリセットされます。これは、これ以上の入力操作を実行する前に行う必要があります。しかしもう1つのことをする必要があります。入力に失敗すると、読み取ろうとしていた文字のいずれかが入力バッファに残ります。したがって、入力を再度収集しようとすると(エラーをクリアした後)、再度失敗します。したがって、バッファに残っているデータを削除する必要があります。あなたはそれを行うことができ、このように:

std::streamsize amount_to_ignore = std::numeric_limits<std::streamsize>::max(); 
std::cin.ignore(amount_to_ignore, '\n'); 

これは、(あなたが最後のキー入力押されたときから、そこにする必要があります)改行文字を見つけるまでそのバッファ内のすべての文字を破棄するcinに指示します。

これは、私の意見では、ユーザーの入力を行うには非常にclunkyでエラーが発生しやすい方法です。私はcinから読み取るときにはstd::getlineを排他的に使用することをお勧めしますが、メモリ割り当てに失敗した場合は例外ではありません。結果の文字列を手動で解析することで、入力のフォームをより詳細に制御できます。

関連する問題