Eingangspuffer löschen in C++

Jinku Hu 12 Oktober 2023
Eingangspuffer löschen in C++

Dieser Artikel zeigt verschiedene Methoden zum Löschen des Eingabepuffers in C++.

Verwendung von die Funktion std::cin::ignore zum den Eingabepuffer in C++ zu löschen

ignore ist eine integrierte Funktion des Objekts std::cin und kann verwendet werden, um Zeichen aus dem Eingabestream bis zum angegebenen Trennzeichen zu extrahieren und zu verwerfen. Bevor wir das Verhalten der Funktion cin::ignore diskutieren, sollte beachtet werden, dass Standardeingabe- und -ausgabestreams wie cin / cout gepuffert werden, was bedeutet, dass zwischen den Schreib- / Lesevorgängen des Benutzers eine gewisse Buchhaltung stattfindet und den tatsächlichen Pufferstatus im Betriebssystemkern. Dieser Puffer wird von der C++-Bibliothek selbst verwaltet und dient dazu, Lese- / Schreibanforderungen effizienter zu gestalten. Beachten Sie, dass das Aufrufen von Betriebssystemdiensten für jedes Byte eine recht ineffiziente Verwendung der CPU-Ressourcen darstellt. Daher wird der Zwischenpuffer verwendet, um einige Anforderungen zu akkumulieren und dann das Betriebssystem mit einer einzelnen Anforderung aufzurufen.

Somit kann cin::ignore übrig gebliebene Bytes im Puffer verwerfen, die bei aufeinanderfolgenden Aufrufen möglicherweise versehentlich gelesen werden. Der folgende Beispielcode soll das Verhalten ignore deutlicher veranschaulichen. Wir haben eine Endlosschleife while implementiert, die drei Ganzzahlen aus dem Stream cin liest und in den entsprechenden Variablen speichert. Die ganzen Zahlen werden in das cout gedruckt und dann wird die Routine bei der nächsten Iteration ausgeführt. Beachten Sie, dass der Benutzer bei der ersten Iteration möglicherweise mehr als drei Ganzzahlen bereitstellt. In diesem Fall würde der Code vor cin.ignore nur 3 davon speichern, und andere sind noch in einem Zwischenpuffer vorhanden. Wenn nun cin.ignore nicht mit den angegebenen Parametern aufgerufen wird, liest die nächste Iterationszeile cin >> den Rest der Eingabe und das inkonsistente Verhalten tritt auf. Der Aufruf cin.ignore kann in solchen Szenarien verwendet werden, um die Eingabe zu verwerfen, bis das angegebene Zeichen nicht mehr gefunden wird. In diesem Fall haben wir ein neues Zeilenzeichen angegeben, das im Allgemeinen zum Puffern des cin-Streams verwendet wird.

#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;
}

Ausgabe (mit der Beispielbenutzereingabe):

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

Alternativ können wir einen anderen Beispielcode implementieren, der zwei Zeichenketten verwendet, die durch ein Leerzeichen getrennt sind. In diesem Szenario besteht die Möglichkeit, dass der Benutzer mehr als zwei Namen angibt, wodurch dieser Code gezwungen wird, alle Initialen nach zwei durch Leerzeichen getrennten Zeichenketten zu löschen. Wenn die Benutzereingabe nur einen Namen und ein Leerzeichen enthält, wird als zweite Initiale ein Zeilenumbruchzeichen gespeichert, das die Eingabe cin immer beendet. Das letztere Verhalten kann demonstriert werden, indem die Einzelzeichenausgabe nach der Anweisung << name << surname hinzugefügt wird.

#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;
}

Ausgabe (mit der Beispielbenutzereingabe):

Type your name and surname: Lama Lime
Your initials are: LL
``
Autor: 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

Verwandter Artikel - C++ IO