setvbuf not able to make stdin unbuffered
我的主要目的是使getchar在获取字符后立即返回,而不是等待ENTER键。 我试过了
与setvbuf的原型进行比较
1
| setvbuf ( FILE * stream , char * buffer , int mode , size_t size ); |
应该将stdin设置为非缓冲模式。
但是getchar()仍然在等待ENTER
我看过这样的相关文章
读取C中的字符时进行打印
这建议使用其他方法使stdin不受缓冲。 但是我很想知道为什么setvbuf方法不起作用
-
您必须在流上的任何"运动"之前调用setvbuf(),所以main()中的第一件事。
-
@pmg我更新了帖子以反映我的尝试。 但仍然不起作用
-
我认为问题不在于setvbuf()。 我尝试使用带setvbuf()和不带setvbuf()的程序,并且行为不同。 如果不使用setvbuf(),则直到(包括ENTER)的所有字符都将被使用(即使仅在键入ENTER之后才使用)。 如果使用setvbuf(),则仅消耗第一个字符,其余字符用作随后的bash命令。
终端驱动程序直到您按回车键才返回任何内容,即使read()操作将接受已经存在的内容。
要从终端获取逐个字符的输入,您必须将其从规范模式转换为原始模式或cbreak模式,并且这完全需要不同的操作。 查看有关"通用终端接口"的POSIX手册,了解如何控制终端。 或者考虑使用curses库。
另请参阅:规范与非规范终端输入
-
setvbuf(stdin,NULL,_IONBF,0);应该可以吗? 我的意思是setvbuf适用于所有文件指针,但不适用于stdin吗?
-
否。setvbuf()只是告诉程序中的标准I / O库不使用缓冲区。 它没有告诉终端驱动程序任何信息。
如果您要在Linux或其他类似Unix的系统上尝试此操作,则终端将缓冲输入并仅传递整行。 您可以使用ncurses规避此问题:
1 2 3 4 5 6 7 8 9 10
| #include <ncurses.h>
int main ()
{
initscr ();
getch();
endwin ();
return 0;
} |
编译:
1
| gcc -o main main.c -lncurses |
-
谢谢回复。 我看到了这些替代方法,但对为什么setvbuf不起作用感到好奇