使用したアプリケーションの一部Sleep(5000)
(5 秒待つ必要があります)
問題は、ユーザーがこの 5 秒間にキーボードのキーを押すと、スリープ後にキーが読み取られ、アプリに問題が発生することです。
スリープ後にバッファを空にするにはどうすればよいですか?
試しcin.clear()
てみsetbuf(stdin, NULL)
ましたが、バッファに複数の文字がある場合、バッファをクリアできません。
使用したアプリケーションの一部Sleep(5000)
(5 秒待つ必要があります)
問題は、ユーザーがこの 5 秒間にキーボードのキーを押すと、スリープ後にキーが読み取られ、アプリに問題が発生することです。
スリープ後にバッファを空にするにはどうすればよいですか?
試しcin.clear()
てみsetbuf(stdin, NULL)
ましたが、バッファに複数の文字がある場合、バッファをクリアできません。
使用している 2 つの関数には、期待する効果がありません。
clear()
バッファにはまったく影響しませんが、エラー フラグをクリアします。つまり、読み取りに失敗した場合、フラグが設定されます ( std::ios_base::failbit
)。エラー フラグが設定されている間 (他にもいくつかあります)、ストリームは何も読み取ろうとしません。setbuf(0, 0)
ストリームの内部バッファが存在しないように影響します (null 以外の値を使用した呼び出しには、通常は「何もしない」という実装定義の意味があります)。ストリームが非常に遅くなるため、これは一般的に悪い考えです。また、ユーザーが押したキーはおそらくこのバッファーには保存されず、アプリケーションに送信されるまでオペレーティング システムの入力バッファーに保存されます (オペレーティング システムの入力バッファーをオフにするプラットフォーム固有の方法があります。たとえば、POSIX では、tcsetattr()
入力を非標準モードに設定するために使用します)。どちらの場合でも、バッファーを持たないことは実際には役に立ちません。ユーザーは有効な入力を入力した可能性があります。適切なアプローチは、利用可能な入力を読み取ろうとすることです。これが失敗した場合は、問題のある文字 (または複数の文字) を削除します。この目的のために、入力を読み取ろうとし、失敗した場合clear()
はストリームとignore()
1 つ以上の文字を読み取ります (この例では行全体を無視します。ignore()
パラメーターを指定せずに呼び出して、1 文字だけを無視します)。
T value;
while (!(std::cin >> value)) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
とにかく入力が成功したことを常に確認する必要があり、いくつかの余分な行はほんの少しの回復コードを追加しているだけです.
キーボード入力バッファをクリアする最も簡単な方法は次のとおりです。
while(kbhit()) getch();
バッファをクリアしたい場所にそのコードをプログラムに入れるだけです。
そのために必要なヘッダーファイルはconio.hです