setvbuf pas capable de faire stdin sans tampon

Mon intention principale était de faire revenir getchar dès qu’il récupère un caractère au lieu d’attendre la touche ENTER . J’ai essayé ça

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

En comparant cela avec le prototype de setvbuf

 setvbuf ( FILE * stream, char * buffer, int mode, size_t size ); 

il devrait mettre stdin en mode sans tampon.

Mais toujours getchar() continue d’attendre ENTER

J’ai vu des articles liés comme celui-ci

Imprimer en lisant des caractères en C

qui suggèrent des méthodes alternatives pour rendre stdin tampon. Mais je suis curieux de savoir pourquoi la méthode setvbuf ne fonctionne pas

Le pilote de terminal ne renvoie rien avant que vous ayez appuyé sur return, même si l’opération read() accepterait ce qui est déjà là.

Pour obtenir une entrée caractère par caractère à partir d’un terminal, vous devez le sortir du mode canonique en mode brut ou cbreak, ce qui nécessite complètement des opérations différentes. Consultez le manuel POSIX sur l’interface générale du terminal pour savoir comment contrôler le terminal. Ou envisagez d’utiliser la bibliothèque curses .

Voir aussi: entrée de terminal canonique vs non canonique

Si vous essayez ceci sous Linux ou un autre système de type Unix, c’est le terminal qui tamponne l’entrée et ne transmet qu’une ligne entière. Vous pouvez utiliser ncurses pour contourner ceci:

 #include  int main() { initscr(); getch(); endwin(); return 0; } 

Comstackr avec:

 gcc -o main main.c -lncurses