À reformatter, mettre en français, etc.
Pourquoi std::getline ne lit rien, et qu'il faille l'exécuter deux fois pour que la ligne soit lue?
Si vous constatez ce problème, il est fort probable que vous venez d'appeler "std::getline(std::cin)" juste après une lecture sur le flux avec l'opérateur d'extraction: "std::cin >>". (c'est parfaitement valable avec les flux fichiers également)
Ce que vous observez est normal. L'opérateur d'extraction (>>) consomme ce qui vient sur le flux, mais il s’arrête juste
avant le premier espace blanc (
pas sûr du vocabulaire) ou saut de ligne -- voire encore avant selon le type de la donnée à extraire et de ce qui se trouve véritablement sur le flux (ex: l'extraction d'un int depuis "125douze").
De fait, l'operator>> va s’arrêter avant le saut de ligne, et quand std::getline va vouloir extraire la ligne qui suit, en fait il va récupérer les caractères entre la position courante et la fin de la ligne avant de passer à la ligne suivante. Dans le cas d'une interaction avec l'utilisateur, une chaine vide sera obtenue, et le flux sera positionné à la ligne suivante. C'est pour cela qu'un double appel à std::getline
fonctionne.
" - Donc si je comprends bien il faut appeler deux fois std::getline()?"
Seulement si vous voulez récupérer les miettes qui trainent après la dernière chose lue avec >>.
En pratique on a le choix entre :
- un simple std::cin.get() qui marchera uniquement si ce qui suit est un saut de ligne
- ou purger le buffer clavier (cf entrée correspondante:
http://cpp.developpez.com/faq/cpp/?p...e#SL_cin_clear) qui fonctionnera également si des miettes trainent et que l'on préfère les ignorer.
Partager