C++: comment puis-je enlever la mauvaise entrée de cin?
J'ai fait quelques cin
de fonctionnement et d'avant-je utiliser cin
je veux effacer son état et
le rincer. Comment dois-je faire? Je sais cin.clear()
efface l'erreur de l'état, mais pour vider le cin
tampon comment puis-je vérifier si il est vide et si pas qui des déclarations ci-dessous doit-je utiliser pour le vider afin que je puisse utiliser en toute sécurité cin
plus tard?
cin.ignore(std::numeric_limits<std::streamsize>::max());
ou
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
merci de voir gidforums.com/t-15686.html pour un aperçu général (d'abord répondre à l'OP)
OriginalL'auteur ajay | 2013-10-19
Vous devez vous connecter pour publier un commentaire.
Il semble, vous avez détecté un problème et que vous voulez vous débarrasser de faux entrée, par exemple, l'entrée ligne. Vous pourrait essayer de se débarrasser de ce
std::cin
a dans sa mémoire tampon, mais généralement, cela ne fonctionne pas trop bien car il n'y a aucune garantie que le flux a lire, par exemple, une ligne complète. Aussi, pour le rendre potentiellement utiles dont vous aurez besoin pour vous assurer questdin
etstd::cin
ne sont pas synchronisés autrementstd::cin
ne sera jamais de la mémoire tampon de tous les caractères de toute façon:Si
in_avail()
renverra une valeur différente de zéro dépend entièrement de l'utilisé de la mémoire tampon, et il peut ignorer plus que vous avez réellement envie de les ignorer, de toute façon. Par exemple, sistd::cin
's de la mémoire tampon est remplacé à l'utilisation de la mémoire tampon du flux d'unstd::istringstream
il sera probablement consommer tout le caractère de cette source.Probablement le plus sensible de nettoyage est à
ignore()
le caractère suivant ou les caractères sur la ligne courante, à l'aideou
La
max()
destd::streamsize
est utilisé comme un nombre magique pour indiquer que le compte ne doit pas être considérée comme un licenciement critères. Si vous ne passez pas d'un caractère de fin le flux ignorer les caractères jusqu'à la fin du cours d'eau qui n'est probablement pas ce que vous voulez.EOF
parctrl+d
bien sûr: les conditions de résiliation pour
ignore()
sont: 1. il a lu autant de caractères comme indiqué par le premier argument (par défaut 1); 2. le caractère de fin a été conumed (par défautstd::char_traits<char>::eof()
qui indique qu'aucun caractère ne doit être assortie); 3. la fin du flux est atteinte. La spécification destd::numeric_limits<std::streamsize>::max()
rend le comptage à l'infini et ne pas spécifier de résiliation caractères provoque le flux ne jamais s'arrêter en raison d'un personnage, c'est à dire, il ne s'arrêtera qu'une fois que le flux est consommé.désolé, mais juste pour éclaircir mes doutes, à la fin du flux est atteinte lorsque EOF est rencontré?
EOF == Fin De Fichier, qui est le terme conventionnel pour atteindre l'entrée. Notez, cependant, que les flux ne sont pas nécessairement rencontre C
EOF
mais plutôtstd::char_traits<cT>::eof()
: cette valeur est utilisée comme un indicateur d'erreur en fonction retournant uncT
(qui est justechar
pour les ruisseaux étroits) quand il n'y a pas de personnage.OriginalL'auteur Dietmar Kühl
Flux tampons ont la
in_avail
méthode. Mais essayez tout simplement de supprimer le contenu indépendamment.:OriginalL'auteur 0x499602D2
Effectivement, cela peut être fait avec la méthode is_avail().
Essayez ceci:
OriginalL'auteur DarzVader