2

使用したアプリケーションの一部Sleep(5000)(5 秒待つ必要があります)

問題は、ユーザーがこの 5 秒間にキーボードのキーを押すと、スリープ後にキーが読み取られ、アプリに問題が発生することです。

スリープ後にバッファを空にするにはどうすればよいですか?

試しcin.clear()てみsetbuf(stdin, NULL)ましたが、バッファに複数の文字がある場合、バッファをクリアできません。

4

3 に答える 3

7

使用している 2 つの関数には、期待する効果がありません。

  1. clear()バッファにはまったく影響しませんが、エラー フラグをクリアします。つまり、読み取りに失敗した場合、フラグが設定されます ( std::ios_base::failbit)。エラー フラグが設定されている間 (他にもいくつかあります)、ストリームは何も読み取ろうとしません。
  2. 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');
}

とにかく入力が成功したことを常に確認する必要があり、いくつかの余分な行はほんの少しの回復コードを追加しているだけです.

于 2012-12-21T09:50:15.343 に答える
2

キーボード入力バッファをクリアする最も簡単な方法は次のとおりです。

while(kbhit()) getch();

バッファをクリアしたい場所にそのコードをプログラムに入れるだけです。

そのために必要なヘッダーファイルはconio.hです

于 2015-08-03T09:30:35.730 に答える