Warum gibt in_avail () auch dann null aus, wenn der Stream ein char enthält?

8
%Vor%

Ich denke, das wird 0 und 2 ausgeben

aber wenn ich den Code ausführe, gibt er 0 und 0 aus, warum?

oder wenn ich cin.putback (1) ändere; zu int a; cin & gt; & gt; ein; mit Eingabe 12 12;

gibt immer noch 0 und 0 aus

    
miskcoo 04.07.2013, 15:50
quelle

2 Antworten

2

Was passiert sein muss ist, dass Ihr putback im streambuf get Bereich, der std::cin zugeordnet ist, keinen Platz gefunden hat (sonst wäre eine Leseposition verfügbar gewesen und egptr() - gptr() wäre nicht Null gewesen) ) und muss dank pbackfail zu einer darunterliegenden Ebene gegangen sein.

in_avail() ruft showmanyc() auf und Null (was die Standardimplementierung dieser virtuellen Funktion ist) ist eine sichere Sache, da es bedeutet, dass ein Lesevorgang möglicherweise blockiert und möglicherweise fehlschlägt, aber auch nicht garantiert wird . Natürlich ist es möglich, dass eine Implementierung in diesem Fall eine hilfreichere Implementierung für showmanyc() bietet, aber die einfache Implementierung ist billig und konform.

    
Charles Bailey 04.07.2013, 16:27
quelle
1

Offenbar ist es ein Bug / Feature einiger Compilerimplementierungen Fügen Sie die Zeile

ein %Vor%

irgendwo am Anfang des Codes, und das sollte es beheben

BEARBEITEN: Denken Sie auch daran, dass in_avail immer 1 mehr als die Anzahl der Zeichen in der Eingabe zurückgibt, weil es das Ende des Eingabezeichens zählt.

EDIT2: Wie ich gerade überprüft habe, funktioniert Putback nicht, es sei denn, Sie haben versucht, zuerst etwas aus dem Stream zu lesen, daher das "Zurück" in "Putback". Wenn Sie Zeichen in das CIN einfügen möchten, wird dieser Thread die Antwort liefern: Injection string to 'cin'

    
MadOgre 25.03.2015 17:06
quelle

Tags und Links