このコードは、ほとんどの場合、ユーザーに1文字の入力を求め、関連するアクションを実行し、ユーザーにReturnキーを押して、繰り返すように求めるという、希望どおりに機能します。ただし、プロンプトで^ D(EOF)と入力すると、無限ループが発生します。std :: cin.clear()を介してエラー状態をクリアし、std :: cin.ignore(...)を呼び出してバッファーをクリアしています。何が無限ループを引き起こしている可能性がありますか?
#include <iostream>
#include <limits>
void wait()
{
std::cout << std::endl << "press enter to continue.";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.clear();
std::cin.get();
}
int main()
{
char response;
while (true)
{
std::cout << "enter a character at the prompt." << std::endl << "> ";
std::cin >> response;
switch (response)
{
case 'q':
exit(0);
break;
}
wait();
}
}
重要な場合は、これをMacOSXターミナルで実行しています。
更新:ここで私が本当に求めているのは、ユーザーがプロンプトでEOF(^ D)を入力したときに、(a)それを検出し、(b)ユーザーがデータを入力し続けることができるようにストリームをリセットする方法です。
次の例は上記のコードとは異なりますが、^ Dが検出された後にストリームをクリアし、そのストリームからの読み取りを続行するという同じ原則を示しています。
> a 入力したもの:a > b 入力したもの:b > ^ D EOFを入力しました > c 入力したもの:c ..。