Cin-Buffer
-
Keine Ahnung - ich kann die Skizze leider nicht betrachten (da kommt nur eine Fehlermeldung "Ungültige Angabe: Anhang").
-
mhh.. son mist^^
Ich muss das heute Abend hochladen, wenn ich von der Arbeit zurück bin und auch auf FTP zugreifen kann.
Momentan lässt das leider der Proxy nicht zu
-
Okay... das hier müsste eigentlich gehen.
So stelle ich mir cin jetzt vor- nicht als Funktion.
Sondern als Klasse, mit der Schreibfunktion.http://jesusfreak777.je.funpic.de/cin.JPG
Richtig so?
-
Fast richtig.
cin.ignore() wirft auch Daten weg, die aktuell noch gar nicht im cin-Puffer stehen. Und die Statusbits liegen nicht im Puffer, sondern im Stream (btw, es gibt auch noch das eofbit - und goodbit ist nur eine Kurzform für "alle Fehlerbits sind zurückgesetzt).
-
Okay... vielen Dank
Ich denk das reicht dann vorläufig als Erklärung x.DD
-
CStoll schrieb:
void wait() { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); cin.get(); }
(sollte mal jemand in der Konsolen-FAQ berichtigen)
Da ich jetzt grade mal bei einem kleinen Testprogramm auf der Konsolen mal diese wait Variante mal ausprobiert habe, bin ich gegenüber der FAQ-Variante auf ein unschönes Verhalten gestolpert:
FAQ-Variante: Ein Return zum Beenden
Diese Variante: Zwei Returns sind zum Beenden nötig#include <iostream> #include <limits> void wait(bool faqVariante) { if(faqVariante) { // FAQ-Variante std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.get(); } else { // Neue Variante std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); } } int main() { wait(false /* true */); return 0; }
Es mag vielleicht an meiner Entwicklungsumgebung liegen (Visual Studio 2005 Std, Windows Vista), sollte aber bevor jemand an der FAQ rumschraubt mal von anderen überprüft werden.
cu André
-
Hmm, das könnte daran liegen, daß du vor dem wait()-Aufruf keine anderen Eingaben erwartet hast.
ignore() sucht nach dem ersten \n im Eingabepuffer und entsorgt alle Daten, die davor angekommen sind (und normalerweise hat es die Aufgabe, die Überreste der letzten Eingabe (cin>>irgendwas lässt nachfolgende Whitespaces inklusive des Bestätigungs-ENTER im Tastaturpuffer zurück) zu entsorgen). Das heißt, hier entsorgst du das erste ENTER und wartest dann darauf, daß noch eine Eingabe kommt.
(mir fällt allerdings keine Möglichkeit ein, portabel festzustellen, ob sich aktuell noch Eingabe-Reste im Tastaturpuffer befinden)
-
ich häng mal eine ähnliche frage an
char[] string = "Test"; cin >> string; cout << string;
das cout gibt den eingelesenen string aus. ist vielleicht ne naive frage, aber mir fällt erst jetzt auf, dass das funktioniert.
es geht hier um ein beispiel, dass von einem Cpp-Anfänger kam, ich selbst
würde da sowieso ein paar consts reinhauen.
gibt cin dabei einen pointer auf ein dynamisches char-feld an? anders könnte ich mir das nicht erklären, sonst wäre ja die alloziierung für den neuen string nicht möglich
-
Nein, cin schreibt einfach in den Speicherbereich, den du ihm zur Verfügung stellst. In dem Fall solltest du aber maximal 4 Zeichen eingeben, sonst zerstörst du im Nebeneffekt die Daten, die hinter dem Array untergebracht sind.
(PS: Und das nächste Mal verwende bitte einen neuen Thread für eine neue Frage)
-
crashterpiece schrieb:
...aber mir fällt erst jetzt auf, dass das funktioniert....
Ist aber (mehr oder weniger) Zufall.
crashterpiece schrieb:
...ich selbst
würde da sowieso ein paar consts reinhauen...
Ich würde an Deiner Stelle da erstmal "std::strings reinhauen".
crashterpiece schrieb:
...wäre ja die alloziierung für den neuen string nicht möglich
Findet ja auch nicht statt.
Gruß,
Simon2.