2010-02-26 19 views
5

Ich habe Leute wie Dinge tun, gesehen ....Iostream, einige Fragen

istringstream ibuf; 

if (ibuf >> zork >> iA >> Comma >> iB) 

jetzt denke ich, der Wert hängt davon ab, was >> iB macht aber genau das, was ist das und was bedeutet es? Bedeutet das wirklich, dass alle Ietms extrahiert wurden?

Auch nach einem Ausdruck wie

ibuf >> zork >> iA >> Comma >> iB; 

ist es eine Möglichkeit, wie viele Zeichen und Elemente, um herauszufinden, wo extrahieren?

Antwort

3

Dies funktioniert, weil von zwei Eigenschaften von istream Objekte:

  • iStreams selbst zurückkehren nach jeder Extraktion (der >> Operator) mehrere Extraktionen (a >> b >> c)
  • iStreams zurückkehren ihren Status (als ob .good() zu ermöglichen Verkettungs genannt wurden), wenn sie gegossen/konvertiert, in bool über Überlastung bool operator !()

Grundsätzlich ist der Code, den Sie schrieb eine Kurz Hand ve rsion von:

if (((((ibuf >> zork) >> ia) >> Comma) >> ib).good()) { 

} 

Sobald alle Extraktionen aufgetreten sind, sind Sie mit if (ibuf) hinterlassen, die wie das Schreiben if ((bool)ibuf) implizit ist, die ibuf.good() prüft.

Es gibt keine Möglichkeit, die Anzahl der extrahierten Zeichen über eine Reihe von verketteten Extraktionen zu ermitteln. Sie können jedoch die Anzahl der während der letzten Operation extrahierten Zeichen mit der Funktion gcount ermitteln. Es funktioniert jedoch nur für bestimmte Funktionen, die das Format ignorieren, wie get und getline, und nicht den Extraktionsoperator.

+0

Dies ist keine Umwandlung, sondern eine implizite Typkonvertierung Minor nit. – dirkgently

+0

Gibt es einen technischen Unterschied zwischen einer "impliziten Umwandlung" und einer "impliziten Konvertierung"? Bedeutet das etwas, was die andere nicht tut? – meagar

+0

Wenn ich bin Lesen http://www.cplusplus.com/reference/iostream/istream/ richtig ist es Operator und Operator void * nicht Operator Bool. Das Endergebnis ist das gleiche obwohl. –

1

Der zweite Teil des Codes liest eine Reihe von Werten von ibuf zu den folgenden Variablen. Die Rückgabe des versteckten operator >>() Aufrufs ist jedoch ein istringstream Objekt. Es gibt keine direkte Möglichkeit, die Anzahl der Zeichen zu ermitteln.

Sie können die gcount Mitgliedsfunktion auschecken, die die Anzahl der Zeichen für die letzte unformatierte Eingabeoperation angibt. Beachten Sie, dass dies pro Operation ist, daher kann die Kaskadierung nicht verwendet werden. Sie können auch die read Elementfunktion verwenden.

Edit:

(ibuf >> zork >> iA >> Comma >> iB) 

ist eigentlich:

((((ibuf.operator >>(zork)).operator >>(iA)).operator >>(Comma)).operator >>(iB)) 

Die Verschachtelungsebene der Klammer sagen Sie die Reihenfolge der Anrufe (und die Argumente).

+0

@dirkgently: Können Sie mir sagen, mehr über die‚hidden Operator‘Vielleicht mein Beispiel in eine komplette Klammer erweitern und zeigen –

+0

@ Mike D:? Aktualisiert Antwort: – dirkgently

0
if (ibuf >> zork >> iA >> Comma >> iB) 

ist logisch gleich:

ibuf >> zork; 
ibuf >> iA; 
ibuf >> Comma; 
ibuf >> iB; 
if (ibuf) ... 

„ist es eine Möglichkeit, wie viele Zeichen und Elemente, um herauszufinden, wo extrahiert?"

Es ist Memberfunktion‚gcount‘: http://www.cplusplus.com/reference/iostream/istream/gcount/

+0

Nein, checking '.good()' ist nicht sauberer und verhält sich tatsächlich anders. Verwenden Sie 'if (ibuf)' im obigen Code. –

+0

Sie haben Recht. .good() prüft nur auf Fehlerflags (bearbeitet). – neverlord

+0

Sie können den @ -Syntax verwenden, damit ich weiß, dass Sie mir geantwortet haben, und in diesem Fall ändern Sie die Abstimmung; Aber ich bin dieses Mal sowieso hier gewesen. :) –