Comment puis-je vider le tampon cin?
12 réponses
Éventuellement:
std::cin.ignore(INT_MAX);
Cela lirait et ignorerait tout jusqu'à EOF
. (vous pouvez également fournir un deuxième argument qui est le caractère à lire jusqu'à (ex: '\n'
pour ignorer une seule ligne).
Aussi: vous voulez probablement faire un: std::cin.clear();
avant cela aussi pour réinitialiser l'état du flux.
Je préférerais les contraintes de taille C++ sur les versions C:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin.clear();
fflush(stdin);
Ce fut la seule chose qui a fonctionné pour moi lors de la lecture de la console. Dans tous les autres cas, il serait soit lu indéfiniment en raison du manque de \n, soit quelque chose resterait dans le tampon.
Modifier: J'ai découvert que la solution précédente a empiré les choses. Celui-ci cependant, fonctionne:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
, j'ai trouvé deux solutions à cela.
La première, et la plus simple, est d'utiliser std::getline()
par exemple:
std::getline(std::cin, yourString);
... qui va jeter le flux d'entrée quand il arrive à une nouvelle ligne. Lire plus sur cette fonction ici.
Une autre option qui rejette directement le flux est la suivante...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Bonne chance!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
Je préfère:
cin.clear();
fflush(stdin);
Il y a un exemple où cin.ignorer ne le coupe pas, mais je ne peux pas y penser pour le moment. C'était il y a un moment où j'avais besoin de l'utiliser (avec Mingw).
Cependant, fflush (stdin) est un comportement indéfini selon la norme. fflush () est uniquement destiné aux flux de sortie. fflush (stdin) ne semble fonctionner que comme prévu sur Windows (avec les compilateurs GCC et MS au moins) comme une extension de la norme C.
Donc, si vous l'utilisez, votre code n'est pas va être portable.
Voir en utilisant fflush (stdin) .
Voir Aussi http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 pour une alternative.
Une autre solution possible (manuelle) est
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Je ne peux pas utiliser fflush ou cin.flush () avec CLion donc cela est venu à portée de main.
Ce qui suit devrait fonctionner:
cin.flush();
Sur certains systèmes, il n'est pas disponible et vous pouvez ensuite utiliser:
cin.ignore(INT_MAX);
#include <stdio_ext.h>
Puis utilisez la fonction
__fpurge(stdin)
Moyen le plus simple:
cin.seekg(0,ios::end);
cin.clear();
Il positionne simplement le pointeur cin à la fin du flux stdin et cin.clear() efface tous les indicateurs d'erreur tels que l'indicateur EOF.
cin.get()
semble le rincer automatiquement assez curieusement (probablement pas préféré cependant, car c'est déroutant et probablement Capricieux).