9

我的程序必须从标准输入中读取一个字符,所以我使用read(0, buffer, 1). 但是,如果用户插入多个字符,它们会保留在某个缓冲区中,当我read再次调用 a 时,它们仍然存在。

那么,我怎样才能丢弃这些字符呢?我希望当我再次调用 aread时,缓冲区充满了新字符,而不是旧字符。

一个例子:我有 aread(0, buffer, 1)并且用户写abcde。我的缓冲区包含a(这是正确的),但随后我read(0, buffer, 1)再次调用,我想要用户从现在开始写入的下一个字符,而不是之前写入的b

4

2 回答 2

20

POSIX 的答案是tcflush()刷新未传输的输出数据、未读取的输入数据,或两者兼而有之。还有tcdrain()等待输出被传输的。自从有一个 POSIX 标准(1988 年试用版)以来,它们就一直在 POSIX 中,尽管我不记得曾经直接使用过它们。

示例程序

编译此代码,以便调用生成的程序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
$

好像是医生吩咐的。没有第二个tcflush(),shell 会抱怨找不到命令eftcflush()如果您愿意,可以在第一次阅读之前放置一个。对于我的简单测试来说,这不是必需的,但如果我使用sleep 10; ./tcflush然后提前输入,它会有所作为。

在 x86/64 机器上的 RHEL 5 Linux 以及 Mac OS X 10.7.4 上进行了测试。

于 2012-06-07T20:02:01.283 回答
5

当您的程序想要开始读取字符时,它必须耗尽现有字符的缓冲区,然后等待读取字符。

否则,它将读取输入的最后一个字符,而不是now之后输入的最后一个字符。

当然,您不需要对读取的字符做任何事情;但是,您确实需要阅读它们。

于 2012-06-07T19:54:29.847 回答