std::cin-Buffer zuverlässig löschen
-
Tach erstmal
ich hab schon früher mal gefragt, wie man es am Besten macht dass man bei einem std::cin.ignore() nicht den Rest des vorherigen std::cin>>var; 's einliest (und dann ignoriert) ... als Antwort hab ich diese Funktion bekommen:
inline void wait() { std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.get(); }
Das hat auch sonst immer gut funktioniert: Nach jedem std::cin habe ich einfach diese Funktion aufgerufen, um den Buffer zu löschen.
Jetzt gibts damit ein paar Probleme:
Ich muss zuerst mit einem std::cin einen Integer lesen und dann mit std::getline einen String:std::cin>>again; wait(); // ... std::getline(std::cin,filename); wait();
so muss ich 2 mal Enter drücken nachdem ich den Dateinamen (für getline) eingegeben habe.
Dann habe ich einfach mal das std::cin.get(); weggelassen:
inline void wait() { std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail()); }
jetzt liest das getline einen leeren String in filename rein. Der String ist leer und auch die erneute abfrage des strings (schleife) funzt nicht. Offensichtlich wird das richtige eingelesen (Ausgabe des Strings) aber das öffnen der Datei funzt nicht
funktionieren tut es, wenn ich nach dem std::cin wait mit std::cin.get(); habe und nach dem getline wait ohne std::cin.get(); (2 verschiedene funktionen: wait() mit, empty_cin() ohne std::cin.get()).
wie müsste denn die Funktion aussehen, um nur den buffer zu löschen und nicht auf ein enter zu warten?
Danke im Voraus
PS: wo finde ich denn den C++-Standart im INet ?
-
Das Problem liegt bei std::getline() einen Fix findest du auf HumeSikkins Page bens.c-plusplus.info :).
MfG SideWinder
-
Direktlink: http://fara.cs.uni-potsdam.de/~kaufmann/progs/STLFix.ZIP
MfG SideWinder
-
SideWinder schrieb:
Das Problem liegt bei std::getline() einen Fix findest du auf HumeSikkins Page bens.c-plusplus.info :).
MfG SideWinder
Tach erstmal
ich benutz' aber MinGW/GCC 3.2 (win32) bzw. GCC 3.3 (prerelease, Linux)
laut der STLFix.txt ist das zeugs nur für MS VCC, oder ?
(ist std::cin.get() nötig zum Löschen des Buffers oder wartet das Programm damit auf ein <Enter>?)
-
sync
-
aaaaaaa schrieb:
sync
Nicht so ausführlich, bitte
[EDIT]
mit den MS VC-Headern funzt das natürlich nicht
[/EDIT]
-
-
HumeSikkins schrieb:
Hallo,
oder unter Verwendung einiger gcc-Compiler:void wait () { cin.clear(); cin.sync(); cin.get(); }
Tach erstmal
ist das denn ISO-Konform ? (funzen tut's)
-
ISO-konform ja.
Nur komisch, imho ist sync() eben nicht für das Löschen des Buffers zuständig (und das laut Hume)
- aber eventuell liegts an der anderen Std-Lib, eventuell haben die da Mist gebaut *g* - wenns funktioniert nimms erstmal ;).
Aber funktionieren könnte es so auch, imho ruft sync() erstmal rdbuf()->pubsync() auf wenn alles gut geht und das wiederrum ruft die protected Methode sync() auf:
The protected virtual member function endeavors to synchronize the controlled streams with any associated external streams. Typically, this involves writing out any elements between the beginning and next pointers for the output buffer. It does not involve putting back any elements between the next and end pointers for the input buffer. If the function cannot succeed, it returns -1. The default behavior is to return zero.
Klingt gut *g*
MfG SideWinder
-
Tach erstmal
meine Funktionen sehen jetzt so aus:
inline void wait() { std::cin.clear(); // std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.sync(); // std::cin.get(); std::cin.ignore(); } inline void empty_cin_buffer() { std::cin.clear(); // std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.sync(); }
ich nehme statt dem std::cin.get(); das std::cin.ignore(); weil das get irgendwas kaputt macht. danach funzt das getline nämlich nicht mehr: es wird offensichtlich richtig eingelesen (ausgabe so wie eingabe) aber die datei lässt sich nicht öffnen, wie schon im ersten posting gesagt ...