2017-05-24 4 views
1

Es scheint gut akzeptiert, dass die istream::peek Operation blockiert.C++ istream :: peek - sollte es nicht blockierend sein?

Der Standard, obwohl wohl etwas mehrdeutig, neigt zu nicht blockierendem Verhalten. peek Anrufe sgetc wiederum dessen Verhalten.

„Das Zeichen an der gegenwärtigen Position der gesteuerten Eingangssequenz, als ein Wert des Typ int Wenn es keine weiteren Zeichen sind von der gesteuerten Eingangssequenz zu lesen, Die Funktion gibt den Dateiendewert (EOF) zurück. "

Es heißt nicht: „Wenn es keine weiteren Zeichen sind ....... warten, bis es“

Fehle ich etwas hier? Oder sind die peek Implementierungen, die wir verwenden, nur irgendwie falsch?

+1

Der von Ihnen zitierte Text ist nicht Teil des C++ Standards –

+0

Zitat von http://www.cplusplus.com/reference/streambuf/streambuf/sgetc/. Eine ähnliche Dokumentation finden Sie unter http://www.cplusplus.com/reference/streambuf/basic_streambuf/sgetc/ sowie unter http://en.cppreference.com/w/cpp/io/basic_streambuf/underflow. Sagst du, dass diese ungenau sind? – Malachi

+1

cpluscplus.com ist eine Mistseite. Der von Ihnen angegebene cppreference-Link enthält den Text in Ihrer Frage nicht. In der Tat heißt es "Stellt sicher, dass mindestens ein Zeichen im Eingabebereich verfügbar ist, indem [...] Lesen von mehr Daten in der Eingabesequenz (falls anwendbar). "Was in diesem Fall anwendbar ist, und" Lesen von Daten aus der Eingabesequenz "beinhaltet das Warten auf mehr Daten, wenn keine vorhanden ist und der Datenstrom nicht in einem EOF oder anderen ist Fehlerzustand –

Antwort

2

Die Beschreibung von cppreference.com könnte in Frage als die, klarer sein:

dass mindestens Sorgt bei einem Zeichen im Eingangsbereich verfügbar ist durch [...] mehr Daten in dem von der Lese Eingangssequenz (falls zutreffend) „

‚gegebenenfalls‘nicht in diesem Fall keine Anwendung, und‚ Daten aus der Eingangssequenz Lesen‘beinhaltet, um weitere Daten warten, wenn es keine gibt, und der Strom ist nicht in einem EOF oder anderer Fehlerzustand

4

Die gesteuerte Eingabesequenz ist die Datei (oder was auch immer), von der Sie lesen. Wenn Sie sich am Ende der Datei befinden, wird EOF zurückgegeben. Andernfalls wird das nächste Zeichen aus der Datei zurückgegeben.

Ich sehe hier nichts, das mehrdeutig ist - wenn es ein Zeichen braucht, das nicht aus der Datei gelesen wurde, dann muss es gelesen werden (und warten bis es gelesen wird, und es zurückgeben).

Wenn Sie von etwas wie einem Socket lesen, dann wird es warten, bis Daten eintreffen (oder der Netzwerkstack erkennt EOF, wie das Trennen des Peers).

+0

Das Wort "warten" erscheint nie in irgendeiner der Spezifikationen, die ich verband. Ihre Kommentare über EOF sind jedoch suggestiv, dass sobald ein EOF empfangen wird, sollte man grundsätzlich nicht erwarten Sie weitere Daten über den Stream. Wäre das Ihre Erwartung von EOF? – Malachi

+0

Nach dem Lesen der Kommentare von MM, scheint das Wort "Gewährleistet" sehr suggestiv einer Warteoperation a nach allen ... – Malachi

2

Wenn ich über die Konsoleneingabe verwirrt bin, erinnere ich mich daran, dass die Konsoleneingabe so umgeleitet werden kann, dass sie aus einer Datei kommt, so dass das Verhalten der Tastatur mehr oder weniger dem Verhalten einer Datei entspricht. Wenn Sie versuchen, ein Zeichen aus einer Datei zu lesen, können Sie eines von zwei Ergebnissen erhalten: Sie erhalten ein Zeichen, oder Sie erhalten EOF, weil Sie das Ende der Datei erreicht haben - es sind keine Zeichen mehr zu lesen. Das gleiche gilt für die Tastatureingabe: Entweder Sie erhalten ein Zeichen, oder Sie erhalten EOF, weil Sie das Ende der Datei erreicht haben. Bei einer Datei gibt es keine Idee, auf weitere Zeichen zu warten: Entweder hat eine Datei ungelesene Zeichen oder nicht. Das Gleiche gilt für die Tastatur. Wenn Sie also EOF auf der Tastatur nicht erreicht haben, gibt das Lesen eines Zeichens das nächste Zeichen zurück. Sie erreichen EOF auf der Tastatur, indem Sie das Zeichen eingeben, das Ihr System als EOF erkennt. auf Unix-Systemen, die Ctrl-D ist, unter Windows (wenn ich mich richtig erinnere), das ist Ctrl-C. Wenn Sie EOF nicht erreicht haben, müssen mehr Zeichen gelesen werden.

+0

Ja, dieses Q & A hat mir gezeigt, dass ich falsch über EOF nachgedacht habe. Danke für deinen Beitrag – Malachi

Verwandte Themen