Std::sync()



  • Eine Frage, spricht etwas dagegen,

    std::cin.sync() zum "Flushen" bzw. leeren der Verbliebenen Zeichen im Stream zu benutzen ?

    char c, d;
    std::cin >> c;
    
    std:.cin.sync();
    std::cin >> d;
    

    Finde das ganz... Praktisch ?



  • sync solltset net verwenden, es kann sich auf jeden PC anders verhalten, also plattformabhängig.


  • Mod

    out schrieb:

    sync solltset net verwenden, es kann sich auf jeden PC anders verhalten, also plattformabhängig.

    Ganz so schlimm ist es nicht, das Verhalten von sync ist schon definiert. Aber aus der Definition geht ganz sicher nicht hervor, dass das Vorhaben des Threaderstellers garantiert funktioniert. Und es wird tatsächlich auch auf vielen Plattformen ungefähr gar nichts bewirken (was mit der Definition von sync vereinbar ist).



  • Ok... wie dann besser lösen ? Eine freie Funktion mit

    void clear(){
    
    std:cin.clear();
    std::cin.ignore(256, '\n');
    }
    

    Hab gerade nichts zu testen, funktioniert das gleich gut mit sync() ?


  • Mod

    Die ganze Vorstellung "verbliebener Zeichen" in einem Stream ist falsch, daher funktioniert nichts wirklich von dem, was du hier versuchst. Wobei dein zweiter Versuch vermutlich ziemlich nah an dem ist, was du wohl eigentlich erreichen möchtest: Alles wegschmeißen bis zum nächsten Zeilenumbruch. Die zweite Lösung erreicht dies fast. Wenn du die 256 noch durch ein std::numeric_limits<std::streamsize>::max() ersetzt, dann funktioniert sie auch für beliebig lange Zeilen.



  • Die ganze Vorstellung "verbliebener Zeichen" in einem Stream ist falsch

    Der Stream ist ja einfach nur ein Datenfluss wo XYZ reinkommt. Mit cin >> char lese ich 1 char aus dem Stream... Der "Rest" bleibt im Stream, bzw. das Enter nach der Eingabe landet ja auch im Strem
    Stell ich mir das so richtig vor ?

    Wie würdes du das dann lösen ?



  • sync_prob schrieb:

    Die ganze Vorstellung "verbliebener Zeichen" in einem Stream ist falsch

    Der Stream ist ja einfach nur ein Datenfluss wo XYZ reinkommt. Mit cin >> char lese ich 1 char aus dem Stream... Der "Rest" bleibt im Stream, bzw. das Enter nach der Eingabe landet ja auch im Strem
    Stell ich mir das so richtig vor ?

    (BTW: Mit cin >> char liest du uU weit mehr als ein Zeichen, da by default auch alle Whitespaces übersprungen werden)
    Das konzeptual Problem ist die Verbindung von Eingabestreams mit der Konsole. Ein Eingabestream ist ein Datenfluss, ja. Allerdings sind - rein konzeptuell - alle Zeichen, die du je eingeben wirst, in diesem Datenfluss. Genauso wie bei einer Datei alles bis zum Ende im Stream steht. Die "verbliebenen Zeichen" sind also alle Zeichen.
    Das, was diese Vorstellung kaputt macht, ist die Konsoleneingabe. Die "schickt" nämlich nur Datenpakete bis zum nächsten '\n' in den Stream. Das heißt, jedes Mal, wenn du Enter drückst, erhält der Stream alle Zeichen bis zu dem Enter. Mit ignore ignorierst du dann alle Zeichen, bis zum Enter. Das sorgt bei der Konsoleneingabe einfach nur dafür, dass der Nutzer eine neue Eingabe machen muss, weil ein weiteres Einlesen vom Stream eine neue Datenanfrage an die Konsole stellt, die dann auf eine Eingabe wartet. Die "verbliebenen Zeichen" werden durch dieses ignore aber nicht gelöscht.


  • Mod

    Man sollte noch erwähnen, dass man beim dem Stream unterliegenden streambuf durchaus so etwas wie "verbliebene Zeichen" sinnvoll definieren kann. Bloß hat dies so gut wie gar nichts mit dem Drücken von Enter bei einer Tastatureingabe zu tun, weshalb die Streamfunktionen wie sync, in_avail, und so weiter, die mit dem unterliegenden streambuf kommunizieren, nicht das tun, was der Threadersteller erwartet.



  • Ok, aber man löst das so in etwa oder?


  • Mod

    sync_? schrieb:

    Ok, aber man löst das so in etwa oder?

    Was ist "das"? Das Verwerfen einer Zeile löst man so, ja (halt mit einem besserem Wert als 256, wie erwähnt. Das clear erscheint auch unpassend an der Stelle). Probleme mit irgendwelchen Eingabepuffern oder gedrückten Tasten löst man hingegen gar nicht; diese Konzepte sind auf Ebene der IO-Streams längst nicht mehr vorhanden. Für so etwas würde man sich ein eigenes (G)UI-Framework bauen müssen, welches direkt mit den IO-Funktionen des Betriebssystems zusammen arbeitet. Oder eben direkt ein fertiges GUI-Framework benutzen.



  • diese Konzepte sind auf Ebene der IO-Streams längst nicht mehr vorhanden

    😕 😕 😕 Hä???


  • Mod

    sync() schrieb:

    diese Konzepte sind auf Ebene der IO-Streams längst nicht mehr vorhanden

    😕 😕 😕 Hä???

    Was gibt's da dran nicht zu verstehen? Ein Stream weiß nichts von Tastaturen, Eingabepuffern und ähnliches. Deshalb funktionieren Streams ja auch (fast) unverändert auf allen möglichen Datenquellen. Aber im Umkehrschluss kann man eben auch nicht mehr auf die Details der Datenquelle zugreifen.


Anmelden zum Antworten