My main intention was to make getchar
return as soon as it gets a character instead of waiting for the ENTER key. I tried this
int main()
{
setvbuf(stdin,NULL,_IONBF,0);
getchar();
return 0;
}
Comparing this with the prototype of setvbuf
setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
it should set stdin
to unbuffered mode.
But still getchar()
keeps waiting for ENTER
I've seen related posts like this
Printing while reading characters in C
which are suggesting alternate methods to make stdin
unbuffered. But I am curious to know as to why setvbuf
method does not work
The terminal driver doesn't return anything until you hit return, even if the read()
operation would accept what's already there.
To get character-by-character input from a terminal, you have to get it out of canonical mode into raw or cbreak mode, and that requires different operations altogether. Take a look at the POSIX manual on 'General Terminal Interface' for how to control the terminal. Or consider using the curses
library.
In case you are trying this under Linux or another Unix-like system, it is the terminal that buffers the input and only passes an entire line. You can use ncurses to circumvent this:
#include <ncurses.h>
int main()
{
initscr();
getch();
endwin();
return 0;
}
Compile with:
gcc -o main main.c -lncurses
来源:https://stackoverflow.com/questions/10247591/setvbuf-not-able-to-make-stdin-unbuffered