c - 清除C中的输入缓冲区

标签 c buffer

我有一个大型程序,一个带有c语言图形的文本扭曲游戏。在我的代码中的某处,我使用kbhit()我做了以下代码来清除我的输入缓冲区:

while ((c = getchar()) != '\n' && c != EOF);    


该代码有效,等待我按下Enter键退出循环。问题是,循环等我按下Enter键,屏幕上将输出其他任何键(不可读)。我的问题是,是否有其他方法可以清除输入缓冲区而无需按任何键,例如使用fflush清除输出缓冲区?

最佳答案

假设您使用的是某种Unix变体。

您需要在此处清除两件事:


由C库管理的FILE *输入缓冲区。
您的程序尚未读取的OS输入缓冲区。


就像输出流一样,第一个可以用fflush清除,只是数据只是被丢弃而不是被写出。

第二个要求一些底层OS I / O调用。通常,您不应该将这些与FILE * I / O函数混合使用,但是在fflush和任何其他读取/获取操作之间它们应该是安全的。

首先,您需要使用select来查看read操作是否会阻塞。这可以有效地检查操作系统缓冲区是否清除。如果read不会阻止,则您执行一个字符的read,然后重复选择。关键是必须在读取并丢弃数据之前检查是否有要读取的数据,否则它将阻塞直到有数据要读取。

代码可能看起来像这样(未经测试):

fflush(stdin);
int stdinin_fd = fileno(stdin);

while (1) {
    fdset readset;
    FD_ZERO(&readset);
    FD_SET(stdin_fd, &readset);
    struct timeval timeout = {0, 0};

    int result = select(stdin_fd+1, &readset, NULL, NULL, timeout);
    if (result == 1) {
        char c;
        read(stdin_fd, &c, 1);
    } else if (result == 0
               || (result == -1 && errno != EINTR)) {
        break;
    } // else loop
}


清除OS缓冲区时,可能有可能使用较大的读取大小,这样会更有效,但是我不确定该文件的可移植性,无论如何,我假设没有太多数据要清除。

关于c - 清除C中的输入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055920/

相关文章:

c - 理解 C 结构

c++ - C和C++中long double和double的区别

python - Geodjango:如何从点缓冲

c++ - Web 服务器缓冲区

javascript - Node.js:tcp 连接中的 zlib 压缩

c - 在 C 程序关闭和重新启动之间保存和检索简单数据的常用方法是什么?

c - 打印字符数组后程序总是缩进?

c - 使用带有 gcc 的线程的 POSIX 程序的问题

c - C 中的宏扩展——检索无符号 32 位字

go - bytes.Buffer ReadFrom与r.Read不同?