Forum Programmation.c vider le tampon stdin

Posté par  .
Étiquettes : aucune
0
28
déc.
2004
Bonjour à tous les codeurs fous (et les autres).

Voilà une petite question à laquelle je ne trouve aucune solution simple et non bourrin :

comment vider le tampon de l'entrée standard ?

fflush() n'est effectif que pour les sorties (hasardeux et donc non portable concernant stdin);

faire appel a un getchar() entraîne une attente et donc une action utilisateur lorsque le dit tampon est vide;

fropen(/dev/tty,r,stdin) est tout bonnement bien trop bourrin... si cette procédure aboutit à l'écrasement des données subsistantes dans le tampon on devrait bien pouvoir faire appel aux quelques fonctions qui nous intéressent appelées par freopen.

Merci d'avance pour vos lumières.
  • # Idée

    Posté par  (site web personnel) . Évalué à 4.

    En fait c'est pas toi qui gère les buffer d'entrée mais "l'autre coté" (ici un shell non?) qui gère les buffers de sortie,
    Et tu recois des qu'il vide ceux de sortie.
    Si tu basse par une console (virtuelle ou non, en pty ou tty enfin des console quoi!), il faut faire deux ioctl (je te passe le code si c'est bien ce que tu veux) pour dire à (l'émulation de) terminal d'envoyer non pas au retour à la ligne, mais à chaque frappe (mode canon si j'ai bonne mémoiré).
    Bon allez pas envie d'attendre la reponse voila le code:

    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
    char car[2];
    struct termios term1,term2;
    ioctl(STDIN_FILENO, TCGETS, (unsigned long*)&term1);
    ioctl(STDIN_FILENO, TCGETS, (unsigned long*)&term2);
    if(!(term1.c_lflag=~ICANON))
    term1.c_lflag=term1.c_lflag|ICANON;
    ioctl(STDIN_FILENO, TCSETS, (unsigned long*)&term1);
    // sleep(1);
    car[0]='\0';
    int i=0;
    while(read(STDIN_FILENO, car, 1)==1) {
    car[1]=0;
    if(car[0]==key) {
    i++;
    }
    }
    ioctl(STDIN_FILENO, TCSETS, (unsigned long*)&term2);
    return i;

    Donc en vrac ca enregistre le "type" actuel, si c'est pas en ICANON il l'active et refait le ioctl pour l'appliquer, teste si un des caractère taper est key (un char pas char*)
    Incremente i si c'est le cas
    à la fin reprend les réglages pré appel
    et retourne le nb de fois que la touche 'key' a ete trouvé
    (code complet dispo ici:http://svn.fnux.org/softwares/unstable/init/keys.c(...) user:anonymous pass vide)
    • [^] # Re: Idée

      Posté par  . Évalué à 1.

      superbe!

      De tous les forums que j'ai parcouru aujourd'hui aucun n'a apporté une solution aussi claire et précise.

      merci merci :o)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.