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?
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:
- std :: basic_ios :: operator ungültig * () Dokumentation auf cppreference Website,
- Die The Safe Bool Idiom Artikel auf Artima
- C ++ FAQ lite §15.4 ,
- der Standard, ...
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.