getchar et EOF - C - Programmation
Marsh Posté le 28-06-2007 à 15:31:53
Je pense que c'est parce que ctrl-d n'indique la fin de fichier que s'il est entré en début de ligne. Si tu n'est pas en début de ligne, ctrl-d va simplement envoyer la ligne.
Quand tu lances ton programme, la ligne est vide. Si tu tapes ctrl-d, le programme va sortir tout de suite. Si tu tapes du texte, rien ne se passe dans ton programme. Il est simplement bloqué dans getchar(), en attente de quelque chose à lire. Quand tu tapes ctrl-d, la ligne (le texte que tu as tapé jusque là) est mise dans le buffer d'entrée et ta boucle dépile les caractères les uns après les autres. Jusqu'au dernier, et à ce moment tu te retrouves dans la situation initiale avec un buffer d'entrée vide et un getchar() bloqué en attente de caractère. C'est reparti pour un tour : si tu tapes ctrl-d tu sors (c'est ton deuxième ctrl-d successif), si tu tappes du texte il te faudra à nouveau deux ctrl-d supplémentaire pour sortir : un pour envoyer la ligne, et un en début de ligne pour signifier EOF.
Je suis clair ?
Marsh Posté le 28-06-2007 à 19:05:32
matafan a écrit : Je suis clair ? |
Limpide !!!
Marsh Posté le 28-06-2007 à 22:05:05
matafan a écrit : Je pense que c'est parce que ctrl-d n'indique la fin de fichier que s'il est entré en début de ligne. Si tu n'est pas en début de ligne, ctrl-d va simplement envoyer la ligne. |
Merci de ton explication , je n'ai pas encore tout compris à vrai dire (je manque de connaissances en la matière), car je ne pensais pas la fonction getchar utilisait un buffer.
En fait, je pensais travailler caractère par caractère (je veux dire comme si à chaque boucle la nouvelle valeur stockée par getchar remplaçait l'ancienne).
Si j'ai bien compris (ou pas), le ctrl+d agit comme un espèce de retour chariot, permettant de vider le buffer d'entrée ?
Je vais essayer de trouver un peu plus d'infos sur le fonctionnement de getchar.
Marsh Posté le 28-06-2007 à 23:09:12
Si tu veux récupérer les caractères directement dès qu'une touche est enfoncé, regarde du coté de curses (ncurses en étant une implémentation libre) et des fonctions comme getch().
Edit : au fait, je ne suis pas sûr de bien comprendre comment les différents éléments s'imbriquent mais je pense que la bufferisation qu'on voit avec getchar ne viens pas de getchar ou de la libc, mais du terminal ou du shell.
Marsh Posté le 29-06-2007 à 14:11:57
microsoft a écrit : Merci de ton explication |
C'est pas getchar qui utilise un buffer, c'est le système qui met en place ce buffer entre le clavier et lui-même pour optimiser les IO
microsoft a écrit : En fait, je pensais travailler caractère par caractère (je veux dire comme si à chaque boucle la nouvelle valeur stockée par getchar remplaçait l'ancienne). |
C'est exactement ce qu'il se passe au résultat. Sauf que chaque tour de boucle lit un caractère depuis le buffer d'entrée. Tu peux d'ailleurs t'en rendre compte si tu tapes une longue suite de lettres, ton programme traitera chaque lettre à chaque tour de boucle...
microsoft a écrit : Si j'ai bien compris (ou pas), le ctrl+d agit comme un espèce de retour chariot, permettant de vider le buffer d'entrée ? |
Permettant plutôt de demander son traitement
Marsh Posté le 28-06-2007 à 15:09:03
Bonjour à tous,
)
Je débute dans le language C, mais je bute sur une chose que je ne comprends pas (déja...
voici mon code:
Quand j'exécute le programme, l'appui sur ctrl+D (qui représente le EOF si j'ai bien compris) ne me permet pas de sortir de la boucle WHILE, je suis obligé d'appuyer une 2de fois sur ctrl+D pour sortir de la boucle et arriver jusqu'au printf.
Je souhaiterais simplement comprendre pourquoi il faut appuyer deux fois sur ctrl+D.
Merci de votre aide.
---------------
Il [e2fsck] a bien démarré, mais il m'a rendu la main aussitot en me disant "houlala, c'est pas beau à voir votre truc, je préfèrerai que vous teniez vous même la tronçonneuse"