web-dev-qa-db-fra.com

Comment vider le tampon cin?

Comment effacer le buffer cin en C++?

103
Tal

Peut-être:

std::cin.ignore(INT_MAX);

Ceci 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 voudrez probablement faire un: std::cin.clear(); avant cela aussi pour réinitialiser l'état du flux.

94
Evan Teran

Je préférerais les contraintes de taille C++ aux 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')
107
Martin York
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 lirait indéfiniment faute de\n, ou quelque chose resterait dans la mémoire tampon.

EDIT: J'ai découvert que la solution précédente aggravait les choses. Celui-ci cependant fonctionne:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
21
jyggorath

J'ai trouvé deux solutions à cela.

La première, et la plus simple, consiste à utiliser std::getline() par exemple:

std::getline(std::cin, yourString);

... qui supprimera le flux d'entrée lorsqu'il atteindra une nouvelle ligne. En savoir 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!

9
Ben
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";
7
user187046

Que diriez-vous:

cin.ignore(cin.rdbuf()->in_avail());
3
asdf

Une autre solution possible (manuelle) est

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

Je ne peux pas utiliser fflush ou cin.flush () avec CLion, c'est donc très pratique.

3
Bobul Mentol

Je préfère:

cin.clear();
fflush(stdin);

Il y a un exemple où Cin.ignore ne coupe tout simplement pas, mais je ne peux pas y penser pour le moment. C'était il y a quelque temps quand j'ai eu 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) semble seulement fonctionner comme prévu sous Windows (avec les compilateurs GCC et MS au moins) en tant qu’extension du standard C .

Donc, si vous l'utilisez, votre code ne sera pas portable.

Voir tilisation de fflush (stdin) .

Voir aussi http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 pour une alternative.

3
Shadow2531

Manière la 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.

2
#include <stdio_ext.h>

et ensuite utiliser la fonction

__fpurge(stdin)
1
techcomp

Ce qui suit devrait fonctionner:

cin.flush();

Sur certains systèmes, ce n'est pas disponible et vous pouvez alors utiliser:

cin.ignore(INT_MAX);
1
Gunnar Steinn

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

0
GuestPerson001