Cin-Buffer



  • 777 schrieb:

    Die von Sidewinder empfolene Wait-Funktion erfüllt leider im folgenden Programm ihren Zweck nicht:

    Diese sollte folgendermaßen aussehen, weil in_avail nicht immer das gewünschte tut.

    void wait() 
    { 
        cin.clear(); 
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
        cin.get(); 
    }
    

    (Achtung Textbaustein *wiederhol*)
    Vielleicht sollte man das in der FAQ mal korrigieren.

    @CStoll: 😃



  • Wäre echt super, wenn das im FAQ geänder wurde.
    Hab keinen Thread gefunden, wo auf das Problem hingewiesen wurde.

    Was muss ich mir unter internem und externem Buffer verstehn?
    Gibts da irgendwo ne Erklärung oder was genau ist das?

    cya
    David



  • Damit habe ich mich auf meine Erklärung oben bezogen - "interner Puffer" ist der Puffer von cin (den kannst du über rdbuf() erreichen), "externer Puffer" ist der Tastaturpuffer des Systems (an den kommst du aus dem Programm heraus nicht dran).

    PS: Ich hab' die Bitt an SideWinder weitergeleitet.



  • Sonst so richtig verstanden?
    Hab mal ne Kleine Paintskizze gemacht 😉

    http://www.postpla.net/attachment.php?attachmentid=4066&stc=1&d=1195209608



  • 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.


Anmelden zum Antworten