Tastatur-Cache löschen
-
Hallo,
wie kann ich den Tastatur-Chace löschen? Die Zeichen die noch drin sind behindern nämlich meinen Programmablauf...
Mit ratlosen Grüßen
DerRatlose
-
std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail());
-
fflush(stdin);
-
Es gibt keine portable C++ Lösung dafür!
-
Danke für die Antworten.
@David_pb: Danke für den Hinweis. Spielt bei meinem Vorhaben aber zum Glück keine Rolle, da es nur unter Windows funktioniert muss.Die Lösung von drakon hat leider nicht geholfen:
string str1, str2; cin >> str1; getline( cin, str2 ); //Wird übersprungen. Auch mit drakon's Lösung zwischen cin und getline ...
Mit fflush(stdin); hat es dann allerdings funktioniert.
Danke.Mit freundlichen Grüßen
DerRatlose
-
Das Verhalten von
fflush(stdin)
ist übrigens nicht definiert.
-
Das Problem bei fflush auf einen Inputstream ist, dass die Funktion nicht zwangsläufig etwas tun muss... Sie kann auch stillschweigend garnichts machen.
Edit: zu spät...
-
Hmm, das ist natürlich nicht so schön. Habe ich eine Alternative?
Mit freundlichen Grüßen
DerRatlose
-
Input-Streams zu leeren ist leider eine absolute Katastrophe. Die Definition im Standard ist so schwammig, dass es keine einfache, portable Lösung gibt. in_avail z.B. kann die Anzahl der Zeichen im Buffer zurückliefern, oder aber 0. Je nach Implementierung. Und das ist auch noch Standardkonform. Es gibt noch einen ganzen Schwung solcher Hemmschuhe. Ganz toller Kuchen.
Hier gibts eine recht gute Abhandlung zu dem Thema bei der am Ende eine Lösung herauskommt.
-
Danke für den Link, werde es mir mal Durchlesen. Da ich gerade schon einmal runtergescrollt habe, scheint es ja recht aufwendig zu werden...
Aber ich glaube für mein kleines Programm belasse ich es bei fflush(stdin).Noch eine Frage zu fflush(stdin):
Wenn es also bei den Tests funktioniert und der Cache gelöscht wird, dann kann es also unter Umständen immernoch dazu kommen, dass die Funktion gar nichts tut?Mit freundlichen Grüßen
DerRatloseEDIT: Ich weiß, ist Offtopic, aber ich habe eine Frage Tachyon: Was steht in deiner Signatur? Bei mir werden nämlich nur vier kleine Quadrate angezeigt in denen in der ersten Zeile eine 30 steht und in der zweiten zwei Buchstaben, die aber in jedem Quadrat unterschiedlich sind. Weiß jemand, warum ich nur die Quadrate sehen kann?
-
DerRatlose schrieb:
Noch eine Frage zu fflush(stdin):
Wenn es also bei den Tests funktioniert und der Cache gelöscht wird, dann kann es also unter Umständen immernoch dazu kommen, dass die Funktion gar nichts tut?Grundsätzlich ist das Verhalten beim flushen von Inputstreams gemäß dem Standard immer undefiniert. Also eigentlich vom gleichen Kalieber wird das lesen/schreiben über Arraygranzen hinaus.
Es gibt aber diverse Implementierungen, bei denen es doch definiert wurde. So z.B. bei der Microsoftschen Implementierung.
Es ist aber trotzdem fragwürdig, die C Standardeingabe zu flushen wenn man eigentlich cin flushen will (auch, wenn es in diesem Fall intern das Gleiche ist).Mit freundlichen Grüßen
DerRatloseDerRatlose schrieb:
EDIT: Ich weiß, ist Offtopic, aber ich habe eine Frage Tachyon: Was steht in deiner Signatur? Bei mir werden nämlich nur vier kleine Quadrate angezeigt in denen in der ersten Zeile eine 30 steht und in der zweiten zwei Buchstaben, die aber in jedem Quadrat unterschiedlich sind. Weiß jemand, warum ich nur die Quadrate sehen kann?
Dafür brauchst Du Unterstützung für asiatische Zeichensätze.
-
Nun ja, in meinem kleinen Programm spielt es, wie gesagt, keine Rolle, dass fflush verwendet wird. Aber es ist gut zu wissen, dass das Ergebnis immer undefiniert ist.
Tachyon schrieb:
DerRatlose schrieb:
EDIT: Ich weiß, ist Offtopic, aber ich habe eine Frage Tachyon: Was steht in deiner Signatur? Bei mir werden nämlich nur vier kleine Quadrate angezeigt in denen in der ersten Zeile eine 30 steht und in der zweiten zwei Buchstaben, die aber in jedem Quadrat unterschiedlich sind. Weiß jemand, warum ich nur die Quadrate sehen kann?
Dafür brauchst Du Unterstützung für asiatische Zeichensätze.
Das dachte ich mir schon. Ist nicht das erste mal, dass ich nur diese Quadrate sehe. Aber gut, dass ich jetzt das genaue Problem kenne.
Mit freundlichen Grüßen
DerRatlose
-
Der Wunsch den Tastaturcache deutet auf falsches Verständnis der Eingabemechanismen hin.
In den meisten Fällen werden C-Streams mit C++-Streams vermischt oder formatierter mit unformatiertem Input.
Den "Tastatur-Cache" zu leeren wäre also i.d.R. eine symptomatische und keine ursächliche "Behebung". IMHO sind solche "Cache-Leerungs-Aktionen" ein echter Bug, der quasi nie am Input liegt, sondern am Programm selbst.
In einem Beispiel vorher wurde zum Beispiel das hier gebracht:
string s1, s2; cin >> s1; getline( cin, s2);
operator >> ist formatierter Input und lässt das '\n' im Stream stehen, ignoriert es beim Lesen dafür aber auch.
getline dagegen ist unformatierter Input und macht nicht das, was man intuitiv erwarten würde, wenn vorher formatierter Input verwendet wurde.Regel 1: Mische niemals formatieren mit unformatiertem Input.
Regel 2: Falls du es doch tust, pass gut auf. Du musst immer wissen, welche Inputform vorher auf den Stream angewandt wurde, und vor allem wie sich diese verhält.Für eine sehr ausführliche Diskussion des Themas kann ich uneingeschränkt das Buch "Standard C++ IOStreams and Locales" von Langer/Kreft empfehlen.
offtopic:
In Tachyons Signatur steht, wenn ich mich richtig erinnere, ta ki yo n in Katakana. Hab gerade selbst keinen asiatischen Font hier installiert.
-
Gut, dann sag mir, wie ich mehr Zeichen als bis zum nächsten Leerzeichen mithilfe von formatiertem Input einlesen kann. Dann tausche ich das gerne gegen getline aus.
Mit frendlichen Grüßen
DerRatlose
-
cin >> string lässt den Whitespace (!!), der das Einlesen beendet hat, im Stream stehen. Wenn du auf unformatierten Input wechseln willst und dich der Whitepsace stört, musst du ihn extrahieren, z.B. mit cin.get() oder cin >> ws.
Für formatierten Input müsstest du dem Stream beibringen, dass ein Leerzeichen kein Whitespace ist.
Ich würde dir dringend nahe legen, dich mit formatiertem und unformatiertem Input genauer zu beschäftigen, damit du das Problem besser verstehst.
-
Hast du zu dem Thema vielleicht einen Link? Das Buch, das du empfiehlst, kostet immerhin um die 50 Euro.
Mit freundlichen Grüßen
DerRatlose
-
Gute Links kenne ich spontan nicht. Gerade das Thema IOStreams wird leider oft nur relativ undetailliert behandelt.
Für den Anfang und dein Beispiel reicht es aber in der Regel aus zu wissen, dass der letzte Whitespace noch im Stream steht und entfernt werden muss, damit getline das Erwartete tut.
-
Dann könnte man doch theoretisch mit cin.get() den Whitespace abfangen, oder? Dann ist er ja nicht mehr im Stream.
Mit freundlichen Grüßen
DerRatlose
-
Oder alle Whitespaces bis zum nächsten Non-Whitespace von cin >> ws; aufessen lassen.
-
Das ist natürlich auch eine Möglichkeit. Vielen Dank für die ganzen Tipps. Vielleicht findet sich ja noch irgendwo in den Weiten des Internets eine Seite, die sich mit Input und Output beschäftigt...
Mit freundlichen Grüßen
DerRatlose