setvbuf无法使stdin无缓冲

时间:2012-04-20 13:49:42

标签: c buffer stdin getchar unbuffered

我的主要目的是让getchar在获得一个字符后立即返回,而不是等待 ENTER 键。我试过这个

int main()
{
    setvbuf(stdin,NULL,_IONBF,0);
    getchar();

    return 0;
}

将其与setvbuf

的原型进行比较
setvbuf ( FILE * stream, char * buffer, int mode, size_t size );

应将stdin设置为无缓冲模式。

getchar()仍在等待 ENTER

我见过这样的相关帖子

Printing while reading characters in C

建议使stdin无缓冲的替代方法。但我很想知道为什么setvbuf方法不起作用

2 个答案:

答案 0 :(得分:20)

即使read()操作接受已存在的操作,终端驱动程序也不会返回任何内容,直到您返回为止。

要从终端获取逐个字符的输入,您必须将其从规范模式转换为原始模式或cbreak模式,这需要完全不同的操作。有关如何控制终端,请查看'General Terminal Interface'上的POSIX手册。或者考虑使用curses库。

另请参阅:Canonical vs non-canonical terminal input

答案 1 :(得分:1)

如果您在Linux或其他类Unix系统中尝试此操作,则它是缓冲输入并仅传递整行的终端。您可以使用ncurses来规避这个:

#include <ncurses.h>

int main()
{
    initscr();
    getch();
    endwin();

    return 0;
}

编译:

gcc -o main main.c -lncurses