Wie spüle ich den Cin-Puffer?

Lesezeit: 4 Minuten

Wie lösche ich den Cin-Puffer in C++?

Wie spule ich den Cin Puffer
Martin York

Ich würde die C++-Größenbeschränkungen den C-Versionen vorziehen:

// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

  • Noch wichtiger ist, dass die Werte unterschiedlich sein können! (streamsize muss nicht int sein)

    Roger Pate

    16. November 2009 um 20:35 Uhr

  • könnten Sie bitte ein Beispiel nennen, wo wir bis zum Ende der Datei ignorieren müssen, weil, wenn ich verwende cin und verwenden Sie die erste Anweisung oben, um die zu spülen cin Puffer, dann fordert es immer wieder zur Eingabe auf, bis ich eintrete EOF durch Drücken ctrl+d?

    – jaja

    19. Oktober 2013 um 19:39 Uhr

  • @ajay: Nein. Das musst du entscheiden. Ich erkläre lediglich, was das obige tun wird.

    – Martin York

    20. Oktober 2013 um 0:52 Uhr

1647212412 841 Wie spule ich den Cin Puffer
Evan Teran

Möglicherweise:

std::cin.ignore(INT_MAX);

Dies würde alles einlesen und ignorieren, bis EOF. (Sie können auch ein zweites Argument angeben, das das zu lesende Zeichen ist, bis (z. B.: '\n' eine einzelne Zeile zu ignorieren).

Außerdem: Sie möchten wahrscheinlich Folgendes tun: std::cin.clear(); davor auch, um den Stream-Status zurückzusetzen.

  • Löschen Sie eher vorher als danach, sodass der Stream in einen guten Zustand versetzt wird, in dem er mit seinem Puffer arbeiten kann.

    – GManNickG

    3. Oktober 2010 um 10:33 Uhr


  • Ich wollte nur darauf hinweisen, dass ich für meinen Fall das ‘\n’ für notwendig halte. Sonst funktioniert das nachfolgende “cin >>” nicht.

    – Kardin

    21. November 2013 um 9:39 Uhr

  • Für mich hält dies an, bis mindestens so viele Zeichen wie das Argument gefunden werden (Microsoft-Compiler)

    – Nik

    23. August 2016 um 19:05 Uhr

  • @Nic – natürlich weist dies den Code an, ALLE Zeichen bis zur angegebenen Menge zu ignorieren. Im Hauptbeispiel wird es im Wesentlichen bis ignorieren EOF (da INT_MAX ist riesig). Wie im Beitrag erwähnt, müssen Sie einen zusätzlichen Parameter von angeben, wenn Sie nur eine einzelne Zeile ignorieren möchten '\n um ihm mitzuteilen, dass Sie ihn nur bis zum Ende der Zeile ignorieren möchten.

    – Evan Teran

    23. August 2016 um 20:08 Uhr

  • Wenn Sie dies beim nächsten Aufruf von getline(cin, input) tun, können Sie den ganzen Tag über ein Zeichen gefolgt von der Eingabetaste drücken, es wird nicht durchgehen.

    – Benutzer3015682

    23. Mai 2019 um 19:39 Uhr

1647212413 989 Wie spule ich den Cin Puffer
jyggorath

cin.clear();
fflush(stdin);

Dies war das einzige, was beim Lesen von der Konsole für mich funktioniert hat. In jedem anderen Fall würde es entweder auf unbestimmte Zeit lesen, weil \n fehlt, oder es würde etwas im Puffer verbleiben.

EDIT: Ich habe herausgefunden, dass die vorherige Lösung die Dinge noch schlimmer gemacht hat. DIESES funktioniert jedoch:

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

  • Ja, verwenden Sie nicht fflush auf stdin (oder jeder Stream, der zum Lesen geöffnet ist) es ist undefiniertes Verhalten

    – WENDYN

    30. Juli 2021 um 18:54 Uhr

Wie spule ich den Cin Puffer
Ben

Ich habe zwei Lösungen dafür gefunden.

Die erste und einfachste ist die Verwendung std::getline() zum Beispiel:

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

… die den Eingabestrom verwirft, wenn er eine neue Zeile erreicht. Lesen Sie mehr über diese Funktion Hier.

Eine andere Option, die den Stream direkt verwirft, ist diese …

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

Viel Glück!

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";

Wie spule ich den Cin Puffer
Martin York

Wie wäre es mit:

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

1647212417 639 Wie spule ich den Cin Puffer
Gemeinschaft

Ich bevorzuge:

cin.clear();
fflush(stdin);

Es gibt ein Beispiel, bei dem cin.ignore es einfach nicht schneidet, aber mir fällt es im Moment nicht ein. Es ist eine Weile her, als ich es verwenden musste (mit Mingw).

fflush(stdin) ist jedoch laut Standard ein undefiniertes Verhalten. fflush() ist nur für Ausgabeströme gedacht. fflush(stdin) scheint nur unter Windows wie erwartet zu funktionieren (zumindest mit GCC- und MS-Compilern) als Erweiterung des C-Standards.

Wenn Sie es also verwenden, wird Ihr Code nicht portabel sein.

Siehe Verwenden von fflush(stdin).

Siehe auch http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 für eine Alternative.

  • spülen (stdin); ist undefiniertes Verhalten (in der Programmiersprache C), ausdrücklich so in 7.18.5.2/2 angegeben

    – Kubbi

    15. Januar 2011 um 5:48 Uhr

  • +1 für die Bereitstellung eines gültigen, funktionierenden Kludges. Manche Menschen haben Jobs, andere haben Standards.

    – Michail

    27. Juli 2012 um 16:18 Uhr


  • @Mikhail: Ihr Job sollte das Schreiben von standardkonformem Code beinhalten. Ich werde sicherstellen, dass Sie in Zukunft nichts mehr verwenden, was Sie geschrieben haben.

    – Ed S.

    4. Januar 2013 um 21:46 Uhr

999270cookie-checkWie spüle ich den Cin-Puffer?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy