std::streambuf::in_avail () immer == 0?



  • Hallo,

    warum liefert mir beim folgendem Code in_avail () immer die Größe 0 zurück? Es muss sich ja wegen dem std::cin.get () noch mindestens ein Zeichen im Eingabepuffer befinden!

    #include <iostream>
    
    int main ()
    {
        std::streambuf *buffer = std::cin.rdbuf ();
        std::cin.get ();
        std::cout << buffer->in_avail ()<< std::endl;
    }
    

    Bei allen anderen, möglichen Versuchen lieferte mir in_avail () immer nur 0 zurück... Ich zweifle langsam schon an der Korrektheit dieser Funktion 😞 Folgender Beispielcode (von cplusplus.com) liefert auch nur 0:

    streamsize size;
      char ch;
    
      streambuf * pbuf;
      pbuf = cin.rdbuf();
    
      cout << "Please enter some characters: ";
      cin >> ch;
    
      size = pbuf->in_avail();
    
      cout << "The first character you entered is: " << ch << endl;
      cout << size << " additional characters in input buffer" << endl;
    

    Wäre toll, wenn mir den Grund jemand nennen könnte, danke!



  • hmm hast du mal nach "Please enter some characters: " ein Leerzeichen und dann ein noch ein paar Zeichen angegeben? Mach das mal ...



  • (D)evil schrieb:

    hmm hast du mal nach "Please enter some characters: " ein Leerzeichen und dann ein noch ein paar Zeichen angegeben? Mach das mal ...

    Dann wäre ja die Antwort auf die Frage zu leicht gewesen 😉 Nein, es klappt nicht, es wird immer nur 0 angezeigt.



  • in_avail() ist seltsam und verhält sich nicht überall so, wie es sich verhalten soll.

    Vllt sagt jemand was genaueres dazu ...



  • Dann erklärt sich auch, weswegen folgender Code aus den Konsolen FAQs nicht funktioniert (auf dem GCC):

    std::cin.clear(); 
    std::cin.ignore(std::cin.rdbuf()->in_avail()); 
    std::cin.get();
    

    Würde mich auch freuen, wenn jemand was Genauerer darüber wissen würde...



  • http://lists.boost.org/Archives/boost/2001/03/9190.php usw. einfach mal durch topic wühlen 😛



  • Ist das eine Anspielung auf Boost, oder soll sich in dem Thread wirklich etwas relevantes befinden? Ich sehe da nichts. Das mit dem oben gezeigten Code zum Leeren der Eingabepuffers war nur ein Beispiel, das stellt ja nicht das eigentliche Problem dar.



  • Hmm müsste eigentlich den richtigen gepostet haben ... ach kann sein das ic noch was anderes in der Zwischenablage hab ... ehm such einfach danach bei google.de oder hier im Forum ... das hatten wir schon mehrmals ...



  • KasF schrieb:

    in_avail() ist seltsam und verhält sich nicht überall so, wie es sich verhalten soll.

    Nein, es verhält sich nur nicht überall so, wie man gerne hätte das es sich verhält. Der Standard sagt mit keinem Wort, dass in_avail einem sagt, ob man noch ein non-blocking read durchführen kann oder nicht. Auch muss in_avail etwaige BS-Puffer (wie z.B. Tastaturpuffer) nicht berücksichtigen. Es liefert lediglich die Anzahl der Zeichen zwischen dem get-Pointer und dem Ende des Eingabepuffers (also egptr() - gptr()). Wenn die Anzahl = 0 ist, was immer ein gültiger Wert ist (z.B. weil der Stream keinen eigenen Eingabepuffer benutzt oder die Zeichen noch im Tastaturpuffer stehen und noch nicht in den Eingabepuffer des Streams übertragen wurden), liefert in_avail() das Ergebnis von showmanyc(), was wiederum selbst lediglich schätzen soll, wieviele Zeichen noch gelesen werden können. Und 0 ist auch hier immer eine gültige Schätzung.



  • HumeSikkins schrieb:

    KasF schrieb:

    in_avail() ist seltsam und verhält sich nicht überall so, wie es sich verhalten soll.

    Nein, es verhält sich nur nicht überall so, wie man gerne hätte das es sich verhält. Der Standard sagt mit keinem Wort, dass in_avail einem sagt, ob man noch ein non-blocking read durchführen kann oder nicht. Auch muss in_avail etwaige BS-Puffer (wie z.B. Tastaturpuffer) nicht berücksichtigen. Es liefert lediglich die Anzahl der Zeichen zwischen dem get-Pointer und dem Ende des Eingabepuffers (also egptr() - gptr()). Wenn die Anzahl = 0 ist, was immer ein gültiger Wert ist (z.B. weil der Stream keinen eigenen Eingabepuffer benutzt oder die Zeichen noch im Tastaturpuffer stehen und noch nicht in den Eingabepuffer des Streams übertragen wurden), liefert in_avail() das Ergebnis von showmanyc(), was wiederum selbst lediglich schätzen soll, wieviele Zeichen noch gelesen werden können. Und 0 ist auch hier immer eine gültige Schätzung.

    Auf so ne Antwort habe ich mal gewartet 😉



  • Jap, danke HumeSikkins. Teile der Stdlib sind ja schon ganzschön verwirrend. 🙄


Anmelden zum Antworten