Effacer le tampon d'entrée en C++

Jinku Hu 12 octobre 2023
Effacer le tampon d'entrée en C++

Cet article montre plusieurs méthodes pour effacer le tampon d’entrée en C++.

Utilisez la fonction std::cin::ignore pour effacer le tampon d’entrée en C++

ignore est une fonction intégrée de l’objet std::cin, et elle peut être utilisée pour extraire et supprimer des caractères du flux d’entrée jusqu’au délimiteur donné. Avant de discuter du comportement de la fonction cin::ignore, il convient de noter que les flux d’entrée et de sortie standard comme cin / cout sont mis en mémoire tampon, ce qui signifie qu’il y a une certaine comptabilité entre les écritures / lectures de l’utilisateur et l’état réel de la mémoire tampon dans le noyau du système d’exploitation. Ce tampon est géré par la bibliothèque C++ elle-même et son but est de rendre les requêtes de lecture / écriture plus efficaces. Notez qu’appeler des services de système d’exploitation pour chaque octet serait une utilisation assez inefficace des ressources du processeur, de sorte que le tampon intermédiaire est utilisé pour accumuler certaines demandes, puis appeler le système d’exploitation avec une seule demande.

Ainsi, cin::ignore peut rejeter les octets restants dans le tampon qui peuvent être lus accidentellement lors d’appels consécutifs. L’exemple de code suivant est conçu pour illustrer plus clairement le comportement ignore. Nous avons implémenté une boucle infinie while qui lit trois entiers du flux cin et les stocke dans les variables correspondantes. Les entiers sont imprimés dans le cout puis la routine est exécutée à l’itération suivante. Notez que l’utilisateur peut fournir plus de trois entiers lors de la première itération. Dans ce cas, le code avant cin.ignore n’en stockera que 3, et d’autres existeront toujours dans un tampon intermédiaire. Maintenant, si cin.ignore n’est pas appelé avec les paramètres donnés, la prochaine itération de la ligne cin >> lira le reste de l’entrée et le comportement incohérent se produira. L’appel cin.ignore peut être utilisé dans de tels scénarios pour rejeter l’entrée jusqu’à ce que le caractère donné ne soit pas rencontré. Dans ce cas, nous avons spécifié un caractère de nouvelle ligne qui est généralement utilisé pour tamponner le flux cin.

#include <iostream>
#include <limits>
#include <sstream>

using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;

int main() {
  while (true) {
    int i1, i2, i3;
    cout << "Type space separated numbers: " << endl;
    cin >> i1 >> i2 >> i3;
    if (i1 == 0) exit(EXIT_SUCCESS);
    cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
    cout << i1 << "; " << i2 << "; " << i3 << endl;
  }

  return EXIT_SUCCESS;
}

Sortie (avec l’exemple d’entrée utilisateur):

Type space separated numbers:
12 32 54
12; 32; 54

Alternativement, nous pouvons implémenter un autre exemple de code qui prend deux chaînes séparées par un séparateur de caractères d’espace. Dans ce scénario, il est possible que l’utilisateur fournisse plus de 2 noms, ce qui forcerait ce code à supprimer toutes les initiales après 2 chaînes séparées par des espaces. S’il n’y a qu’un seul nom et un espace dans l’entrée utilisateur, alors un caractère de nouvelle ligne, qui termine toujours l’entrée cin, sera stocké comme seconde initiale. Ce dernier comportement peut être démontré en ajoutant la sortie de caractère unique après l’instruction << name << surname.

#include <iostream>
#include <limits>
#include <sstream>

using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;

int main() {
  char name, surname;
  cout << "Type your name and surname: ";
  name = cin.get();
  cin.ignore(numeric_limits<std::streamsize>::max(), ' ');
  surname = cin.get();

  cout << "Your initials are: " << name << surname << endl;

  return EXIT_SUCCESS;
}

Sortie (avec l’exemple d’entrée utilisateur):

Type your name and surname: Lama Lime
Your initials are: LL
``
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ IO