cin.rdbuf()->in_avail() liefert immer 0, warum?
-
Warum liefert cin.rdbuf()->in_avail() immer 0?
Das ist für mich echt ein Problem, weil ich nicht weiß, wie man ohne diese Funktion feststellen kann, ob noch ein '\n' im Puffer von cin hängt. Mein Compiler ist der GCC 3.2 (Linux).[ Dieser Beitrag wurde am 13.03.2003 um 17:06 Uhr von Steven editiert. ]
-
Wo ist dein Problem?
Wenn cin.rdbuf()->in_avail() 0 liefert, dann hängt auch kein '\n' im Puffer von cin.
-
Original erstellt von HumeSikkins:
Wo ist dein Problem?
Wenn cin.rdbuf()->in_avail() 0 liefert, dann hängt auch kein '\n' im Puffer von cin.Vielleicht doch:
#include <iostream> using namespace std; int main() { char ch; cout << "Geben Sie ein/mehrere Zeichen ein: "; cin >> ch; cout << "cin.rdbuf()->in_avail(): " << cin.rdbuf()->in_avail() << endl; return 0; }Ich gebe z.B. "ABC" ein und er liefert mir 0.
-
Ist doch vollkommen korrektes Verhalten.

-
@Tobsen: Warum?
Wie kann ich dann den Rest der Zeichen im Puffer loswerden?
-
Ich gebe z.B. "ABC" ein und er liefert mir 0.
Interessant. Was passiert bei folgendem Beispiel?
#include <iostream> using namespace std; int main() { char ch; cout << "Geben Sie ein/mehrere Zeichen ein: "; cin >> ch; cout << ch << endl; // wird hier gewartet? Oder wird das noch zu lesende B // verwendet und danach ausgegeben? cin >> ch; cout << ch << endl; return 0; }
-
Original erstellt von HumeSikkins:
**[quote] Ich gebe z.B. "ABC" ein und er liefert mir 0.
****
Interessant. Was passiert bei folgendem Beispiel?#include <iostream> using namespace std; int main() { char ch; cout << "Geben Sie ein/mehrere Zeichen ein: "; cin >> ch; cout << ch << endl; // wird hier gewartet? Oder wird das noch zu lesende B // verwendet und danach ausgegeben? cin >> ch; cout << ch << endl; return 0; }**[/QUOTE]
Er nimmt das B. Aber was hat das mit in_avail zu tun?

-
Hallo,
versuch's damit:cin.ignore(numeric_limits<int>::max(), '\n');Das sollte auch auf dem gcc funktionieren.
-
@HumeSikkins: Danke! Aber ist so ein Verhalten des Compilers überhaupt ok? Und wenn kein Zeichen mehr drin ist, gibt es jetzt eine unnötige Verzögerung, weil auf das nächste '\n' gewartet wird. So ganz optimal ist das auch noch nicht...
-
Danke! Aber ist so ein Verhalten des Compilers überhaupt ok?
Ich sehe keinen Grund, der dagegen spricht.
Und wenn kein Zeichen mehr drin ist, gibt es jetzt eine unnötige Verzögerung, weil auf das nächste '\n' gewartet wird. So ganz optimal ist das auch noch nicht...
Versuch's statt dem ignore mal mit einem cin.sync(). Das sollte eigentlich funktionieren.
-
cin.sync()? Was macht das?
-
cin.sync()? Was macht das?
Falls es sich um einen gepufferten Stream handelt ruft sync die Methode pubsync des Puffers auf. Die wiederum ruft die protected sync-Methode des Puffers auf, welche in der MSDN wie folgt charakterisiert wird:
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.
Laut Stroustrup: "Die C++ Programmiersprache 3. Auflage, Seite 690":
Ein istream wird durch sync() geflusht...
Dafür kann ich im Standard allerdings keine Bestätigung finden. Zumindest ist es aber scheinbar das, was unter der Lib des gcc 3.2 passiert.
-
Info schrieb:
Das Problem is meist der Mongo vorm Bildschirm!
Noe, bei einigen Implementierungen liefert in_avail nur 0.
gruss
v R