我的程序必须从标准输入中只读取一个字符,所以我使用read(0, buffer, 1).但是如果用户插入多个单个字符,它们会保留在某个缓冲区中,当我read再次调用它时,它们仍然存在.
那么,我怎么能丢弃这些字符呢?我希望当我read再次呼叫时,缓冲区中充满了新角色,而不是旧角色.
一个例子:我有一个read(0, buffer, 1)用户写abcde.我的缓冲区包含一个(和它是正确的),但后来我打电话read(0, buffer, 1)再次,我想下一个字符从现在写的用户,而不是b之前写的.
Jon*_*ler 18
POSIX答案是tcflush():刷新非传输输出数据,非读取输入数据或两者.还有tcdrain()等待输出的传输.他们一直在POSIX,因为有一个POSIX标准(1988年的试用版),虽然我不记得曾经直接使用它们.
编译此代码,以便调用生成的程序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;
}
Run Code Online (Sandbox Code Playgroud)
$ ./tcflush
abc
a
def
d
$
Run Code Online (Sandbox Code Playgroud)
看起来像医生订购的那样.没有第二个tcflush(),shell抱怨它无法找到命令ef.tcflush()如果您愿意,可以在第一次阅读之前放置一个.这对我的简单测试没有必要,但如果我使用sleep 10; ./tcflush然后输入,它会有所作为.
在x86/64计算机上以及Mac OS X 10.7.4上测试RHEL 5 Linux.
当您的程序要开始读取字符时,它必须耗尽现有字符的缓冲区,然后等待读取该字符。
否则,它将读取输入的最后一个字符,而不是现在之后输入的最后一个字符。
自然,您无需对读取的字符进行任何操作;但是,您确实需要阅读它们。