cin.rdbuf()



  • Ich verstehe da was nicht, und zwar, schätzungsweiße es steht noch etwas im cin-Puffer, und ich möchte schaun was da drin steht. Mit dem Befehl cin.rdbuf() kann ich den Inhalt vom cin-Puffer auslesen. Also mach ich einfach:

    ...
    cout << cin.rdbuf() << "\n";
    ...
    

    So, jetzt wird mir der Inhalt vom cin-Puffer ausgelsen. Schön und gut, aber irgend wie bleibt der immer danach hängen, also da ist halt jetzt noch so eine Eingabe Zeile da, und die geht nicht mehr weg. Wie so nä Endlosch Eingabe Schleife.......ich will aber das mein Programm doch ganz normal weiter läuft.
    Weiß jemand was ich meine?!

    Wie kann ich den cin-Puffer Inhalt auslesen, ohne das danach diese blöde Eingabe Endlosschleife is.....oder wie man das auch immer nennen soll.
    Ich will zumindestens nur die Ausgabe vom Puffer mehr net...
    Hoffentlich kann mir jemadn helfen.
    MfG
    Stromberg



  • Hallo Stromberg,

    cin.rdbuf() liest zunächst nichts, sondern gibt Dir den dem cin-istream unterlagerten streambuf. Die Konstruktion

    cout << cin.rdbuf();
    

    bleibt immer auf der Eingabe hängen, weil der streambuf hier bis zum Ende gelesen wird. Nur cin kennt kein Ende; sind keine Zeichen mehr verfügbar, so wartet er auf eine neue Eingabe.

    Wenn Du eine Zeile lesen willst, ist

    string line;
        getline( cin, line );
    

    der normale Weg.

    Willst Du die Zeichen aus cin über den Streambuf lesen, so wäre dies i.A. eine Möglichkeit:

    cin.rdbuf()->sgetc();       // blockiert bis Eingabe, ohne ein Zeichen zu konsumieren
        cout << "--- begin Ausgabe" << endl;
        for( streamsize n = cin.rdbuf()->in_avail(); n; --n )
        {
            cout << char( cin.rdbuf()->sbumpc() );
        }
        cout << "--- end" << endl;
    

    Das sgetc() am Anfang liest das erste Zeichen ohne den Lesezeiger zu inkrementieren. Mit diesem Trick bringt man das Programm dazu auf eine Eingabe zu warten; die mit newline abgeschlossen wird. Erst dann kann das erste Zeichen und damit alle anderen der Zeile gelesen werden.
    sbumpc() liest das aktuelle Zeichen und inkrementiert den Lesezeiger.

    Gruß
    Werner



  • Hallo,

    in_avail() liefert leider nicht in allen Implementierungen das selbe. In der
    FAQ gibt es glaub ich irgendwo einen Beitrag dazu bzw. wenn ihr mal dieses
    Unterforum danach durchsucht, dann duerftet ihr auch einen Thread dazu finden.

    Ich weiss nicht mehr genau, aber irgendwo wurde auch ein Workarround gepostet.

    gruss
    v R


Anmelden zum Antworten