Comment puis-je vider le tampon cin?

Comment effacer le tampon cin en C++?

94
demandé sur Dana the Sane 2008-11-02 20:31:59

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.

86
répondu Evan Teran 2016-01-15 22:30:37

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')
101
répondu Martin York 2008-11-02 18:34:19
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');
}
19
répondu jyggorath 2014-05-21 11:34:25

, 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!

7
répondu Ben 2016-01-15 22:27:37
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";
6
répondu Martin York 2010-09-10 22:26:38

Que diriez-vous de:

cin.ignore(cin.rdbuf()->in_avail());
3
répondu Martin York 2010-09-08 06:36:06

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.

3
répondu Shadow2531 2017-05-23 11:33:24

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.

3
répondu Bobul Mentol 2015-08-07 08:15:48

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);
1
répondu Gunnar Steinn 2010-09-08 17:55:29
#include <stdio_ext.h>

Puis utilisez la fonction

__fpurge(stdin)
1
répondu techcomp 2014-11-08 12:47:35

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.

1
répondu Chaitanya Vaishampayan 2017-09-25 17:45:29

cin.get() semble le rincer automatiquement assez curieusement (probablement pas préféré cependant, car c'est déroutant et probablement Capricieux).

0
répondu GuestPerson001 2015-03-19 21:58:42