# C et C++ > C > Contribuez >  [FAQ] fflush(stdin) => Comment vider le buffer clavier ?

## troumad

Bonjour

L'entre http://www.developpez.com/faq/?page=...buffer_clavier me pose problme car elle considre qu'il y a quelque dans le buffer. Quand il est vide, on attend !

----------


## Mdinoc

Lien correct

En fait, la rponse est simple: Il n'existe rien en standard pour "vider le buffer clavier".

L'entre de la FAQ sert  "finir de lire la ligne courante" (aprs un scanf() ou aprs un fgets() n'ayant pas retourn de \n).
C'est gnralement suffisant tant que tu restes en Command-Line Interface. 

Si par contre tu veux une interface qui n'attend pas [Entre] (et que tu utilises donc getch()) tu peux faire une simple boucle while(kbhit()) getch(); pour vider le buffer clavier.

----------


## Bktero

Ce problme a dj t abord ici : http://www.developpez.net/forums/d76...s/#post6685910

----------


## troumad

Je viens de regarder les diffrentes archives...



> ```
> 
> ```


Pour rendre ce programme compatible avec plus de compilateurs C, il faudrait initialiser les variables au dbut de la fonction.
Et surtout, il faudrait un peu expliquer ! C'est beau de piquer un programme, mais il faut le comprendre !

----------


## Mdinoc

En gros, a fait la mme chose que le while(kbhit()) getch();,  bas niveau, et par blocs de 64 bytes.

Et c'est pour POSIX uniquement.

----------


## Obsidian

Bonjour,




> Pour rendre ce programme compatible avec plus de compilateurs C, il faudrait initialiser les variables au dbut de la fonction.


Euh, elles le sont. De quelles variables non initialises parles-tu ?




> Et surtout, il faudrait un peu expliquer ! C'est beau de piquer un programme, mais il faut le comprendre !




```

```


Le _buffer_ a une longueur de 64 octets, choisie compltement arbitrairement. L'ide tait d'viter de faire un appel systme par caractre, tout en conomisant la pile et en choisissant une taille en rapport avec la quantit de caractres en attente et saisie au clavier, puisque c'est gnralement  cela que sert cette fonction.

Par contre, je m'aperois que j'ai omis de grer la valeur de retour de _fcntl()_ qui peut chouer pour bon nombre de raisons et a, c'est une lacune ! Dsol.




> En gros, a fait la mme chose que le while(kbhit()) getch();,  bas niveau, et par blocs de 64 bytes.


C'est surtout utile l o _kbhit()_ n'est pas disponible, et c'est  bas niveau parce qu'effectivement, puisqu'il n'y a rien d'exploitable dans la norme C, a devient de la programmation systme.

Ensuite,  bas niveau , oui et non parce que a reste un _fread()_, mais il faut bien positionner le _flag_ anti-bloquant d'une faon ou d'une autre.




> Et c'est pour POSIX uniquement.


Oui, c'est comme cela qu'on l'a prsent (dans le _post_ initial en tous cas).

----------


## troumad

Je parlais des variables flag et buffer qui ne sont pas initialises en dbut de procdure, mais plus loin. Toutes les normes de C, surtout les plus anciennes, ne tolrent pas a.

Merci pour tes explications. Il me restera  comprendre certaines notions que je n'ai pas encore comme fcntl.
Je pourrai l'utiliser en le comprenant !

----------


## Mdinoc

> Je parlais des variables flag et buffer qui ne sont pas initialises en dbut de procdure, mais plus loin. Toutes les normes de C, surtout les plus anciennes, ne tolrent pas a.


Elles sont en dbut de bloc, mme C89 autorise a. Peut-tre mme le C K&R.

----------

