[C++] ios/istream, std::getline

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[C++] ios/istream, std::getline

Beitrag von BeRsErKeR »

Hallo,

ich habe mal eine prinzipielle Frage zur Verwendung folgenden Codestücks:

Code: Alles auswählen

std::string line;
while (std::getline(some_stream, line))
{
    // Do something with `line`
}
Mir ist bewusst, dass hier der implizite überladene bool-Operator (seit C++11, vorher der void*-Operator) zum Einsatz kommt. Soweit ich nun aber rausfinden konnte gibt dieser !ios::fail() zurück. Damit kann ich schonmal ausschließen, dass irgendwas mit dem Stream nicht stimmt. ios::fail() liefert aber nur dann true, wenn das failbit oder das badbit gesetzt sind. Davon unabhängig ist aber das eofbit.

Kurz gesagt. Die obige Schleife müsste theoretisch fröhlich weitermachen, wenn sie am Ende des Streams angelangt ist. Mir ist klar, dass das Lesen nach dem Ende des Streams dann zu einem Fehler führt, welcher das failbit setzt. Aber theoretisch liest diese Schleife doch dann 1 mal zu viel oder seh ich das falsch?

Wenn ich es jedoch teste, wird die Schleife genau so oft ausgeführt wie es Zeilen gibt (ob die letzte Zeile mit dem Delimiter endet oder nicht ist dabei egal). Das verwirrt mich schon irgendwie. Ich habe irgendwie die Befürchtung, dass das in anderen Compilern wieder anders ist. Ich benutze gerade den VC10.

Hat jemand Ahnung?
Ohne Input kein Output.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] ios/istream, std::getline

Beitrag von dot »

Es gibt im Prinzip zwei Möglichkeiten, wie std::getline() am Ende eines Stream ankommen kann: Entweder es kommt ans Ende, während es Zeichen liest oder es kommt ans Ende, weil es auf einem Stream aufgerufen wird, der bereits am Ende ist. In ersterem Fall gibt es etwas zu returnen; alles ist vorerst OK; der nächste Durchlauf entspricht Fall 2. In Fall 2 wird das Lesen des nächsten Zeichens durch std::getline() fehlschlagen und das failbit gesetzt... ;)
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C++] ios/istream, std::getline

Beitrag von BeRsErKeR »

Das entspricht ja dann meiner Vermutung. Hab nun aber verstanden wieso die Anzahl der Schleifendurchläufe passt. Er führt den Test auf !failbit() ja erst nach dem Lesen aus, also setzt er quasi beim Prüfen in der Schleifenbedingung das failbit und springt daher gar nicht mehr in die Schleife. Ok nun wird es klar. Manchmal kann das echt verwirrend sein, wenn so viel im Hintergrund abläuft.
Ohne Input kein Output.
Antworten