Frage

Ich habe eine Schleife, die jede Zeile in einer Datei mit getline() lautet:

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

Ich habe bemerkt, dass Aufruf getline() wie dies auch zu funktionieren scheint:

while (getline(is, line))

Was ist denn hier los? getline() liefert einen Strom Referenz. Ist es irgendwie in einen Zeiger umgewandelt werden? Ist das wirklich eine gute Praxis, oder sollte ich auf die erste Form halten?

War es hilfreich?

Lösung

Die istream zurückgegeben durch getline() seinen Betreiber void*() Verfahren implizit aufgerufen hat, die zurückkehrt, ob der Strom in einen Fehler ausgeführt wird. Als solches ist es mehr Kontrollen machen als ein Aufruf eof().

Andere Tipps

Aktualisiert:

Ich hatte fälschlicherweise wies auf die basic_istream Dokumentation für den Betreiber bool () -Methode auf der basic_istream :: Wache Klasse, aber wie wurde dies darauf hingewiesen, ist nicht wirklich was passiert. Ich habe Charles und Lucs richtige Antworten gewählt werden. Es ist eigentlich Operator void * (), dass heißt zu werden. Mehr dazu in dem C ++ FAQ .

Charles hat die richtige Antwort geben.

Was genannt wird, ist in der Tat std::basic_ios::operator void*(), und nicht sentry::operator bool(), die mit der Tatsache ist, dass consistant std::getline() eine std::basic_istream gibt (also ein std::basic_ios), und nicht einen Posten.

Für die Nicht-Gläubigen finden Sie unter:

Ansonsten, wie andere schon gesagt haben, es vorziehen, die zweite Form, die kanonisch ist. Verwenden Sie nicht fail() wenn wirklich Sie einen ausführlichen Code wollen - mich nie erinnern, ob xxx.good() statt !xxx.fail() verwendet werden kann,

Ich würde mit der ersten Form bleiben. Während die zweite Form arbeiten kann, ist es kaum explizit. Ihr Original-Code beschreibt deutlich, was getan wird und wie es wird erwartet verhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top