9

私のプログラムは、標準入力から 1 文字だけを読み取る必要があるため、read(0, buffer, 1). しかし、ユーザーが複数の単一文字を挿入すると、それらは一部のバッファーに残り、read再度 a を呼び出すと、それらはまだそこにあります。

では、どうすればこれらの文字を破棄できますか? readもう一度 a を呼び出すと、古い文字ではなく、新しい文字でバッファーが満たされるようにしたいのです。

例: 私は a を持っていて、ユーザーはabcderead(0, buffer, 1)と書いています。私のバッファにはaが含まれています(そしてそれは正しいです) が、もう一度呼び出して、以前に書かれたbではなく、ユーザーが今から書いた次の文字が必要です。read(0, buffer, 1)

4

2 に答える 2

20

POSIX の答えは、送信されていない出力データ、読み取られていない入力データ、またはその両方をフラッシュすることtcflush()です。出力が送信されるのを待つものもあります。それらは、POSIX 標準 (試用版の場合は 1988 年) があったときから POSIX に含まれていますが、それらを直接使用したことは覚えていません。tcdrain()

プログラム例

結果のプログラムが呼び出されるように、このコードをコンパイルしますtcflush

#include <stdio.h>
#include <unistd.h>
#include <termios.h>

int main(void)
{
    char buffer[20] = "";

    read(0, buffer, 1);
    printf("%c\n", buffer[0]);
    tcflush(0, TCIFLUSH);
    read(0, buffer, 1);
    printf("%c\n", buffer[0]);
    tcflush(0, TCIFLUSH);
    return 0;
}

ダイアログの例

$ ./tcflush
abc
a
def
d
$

医者が注文したもののようです。2 番目tcflush()がないと、シェルはコマンドが見つからないと文句を言いますeftcflush()必要に応じて、最初の読み取りの前にa を配置できます。私の単純なテストには必要ありませんでしたが、使用sleep 10; ./tcflushしてから先に入力した場合、違いが生じるでしょう.

x86/64 マシン上の RHEL 5 Linux、および Mac OS X 10.7.4 でテスト済み。

于 2012-06-07T20:02:01.283 に答える
5

プログラムが文字の読み取りを開始する場合、既存の文字のバッファーを空にしてから、文字の読み取りを待機する必要があります。

それ以外の場合は、 right nowの後に入力された最後の文字ではなく、最後に入力された文字が読み取られます。

当然、読み取った文字に対して何もする必要はありません。ただし、それらを読む必要があります。

于 2012-06-07T19:54:29.847 に答える