Tastaturbuffer mit von c-streams löschen



  • Hallo,

    bei scanf() benutze ich fflush(stdin), aber das funktioniert anscheint nicht bei cin.

    zu mindest nicht hier:

    ...
    for (int i=0; i<100000;i++)
      //irgenwas
    fflush(stdin);
      //irgendwas anderes
    getch();
    

    während der Benutzer hier mit der Tastatur spielt, schreibt er in den Buffer.
    Zumindest wird der getch(); danach übersprungen, was ich nicht will.

    Deswegen würde ich wissen, ob es ein Befehl gibt, um die Tastdrücke vorher zu ignorieren.

    Danke!



  • Hi,

    Du muss das so machen:

    cin.flush();
    

    Funktioniert mit cout und cerr genauso!

    MfG eViLiSSiMo



  • Setz mal folgendes hinter dem Einlesen mit cin ein bzw. vor dein getch():

    // löscht den Einlesespeicher und wartet auf einen Tastendruck 
    std::cin.clear (); 
    std::cin.ignore ( std::cin.rdbuf () -> in_avail () ); 
    std::cin.get();
    

    Ich hoffe das ist was du wolltest.

    Code-Hacker



  • Hallo,
    fflush(stdin); ist weder gültiges C noch C++. fflush ist nicht auf Eingabeströmen definiert.

    getch(); ist weder gültiges C nocht C++. getch() ist eine unportable Funktion, die von einigen Compilern unterstützt wird.

    cin.flush(); ist kein gültiges C++. std::istream besitzt keine Memberfunktion flush.

    Eine Alternative zu Code-Hackers Lösung ist häufig ein simples:
    cin.sync();



  • Guten Abend.

    Statt getch() könnte man doch cin.get() verwenden oder?

    MfG Max



  • HumeSikkins schrieb:

    Eine Alternative zu Code-Hackers Lösung ist häufig ein simples:
    cin.sync();

    Dazu interessiert mich schon lange etwas. Für die Zeile von dir HummeSikkins habe ich:
    std::cin.ignore ( std::cin.rdbuf () -> in_avail () );
    sync() leert den Puffer ist klar, aber was macht die Zeile von mir eigentlich? Ich gebe zu ich habe sie aus dem Forum (habe sonst immer sync() benutzt), aber keine Beschreibung gefunden, wäre nett wenn mir mal jemand erklären könnte was die Zeile machst, also die cin.ignore...
    Muss cin.clear() nicht auch bei der Version mit sync() dahin?

    Master_Max schrieb:

    Guten Abend.

    Statt getch() könnte man doch cin.get() verwenden oder?

    MfG Max

    Ja, das wäre sogar Standardkonform, die andere ist wenn ich mich nicht irre aus der conio.h. Manchmal muss man (bei beiden Versionen) den Puffer zuvor leeren.

    Code-Hacker



  • Hallo,
    cin.clear() löscht alle gesetzten Fehlerbits.

    Die Zeile

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

    im Einzelnen:
    1. cin.rdbuf() liefert den Streampuffer des cin-Objekts
    2. in_avail() liefert die Zahl der bisher noch nicht gelesenen Zeichen die noch im Puffer stehen. Sprich die maximale Anzahl an Zeichen die noch gelesen werden kann, bevor das nächste mal underflow aufgerufen werden muss und damit neue Zeichen vom Eingabegerät gelesen werden.
    3. ignore extrahiert maximale n Zeichen aus dem Puffer und verwirft diese. n ist dabei das erste an ignore übergebene Argument. Falls der Delimiter (default: eof) vorher auftritt stoppt ignore hier.

    Insgesamt verwirft die Zeile also alle Zeichen im Streampuffer von cin, die noch nicht gelesen wurden.



  • Ok, vielen Dank für die Erläuterung!

    Code-Hacker


Anmelden zum Antworten