2009-01-25 14 views
8

Wie erkenne ich und gehe mit std :: ifstream zur nächsten Zeile?ifstream, Ende der Zeile und zur nächsten Zeile wechseln?

Ich weiß, gut würde mir sagen, wenn ein Fehler passiert ist, aber der Strom nicht mehr funktioniert, sobald das passiert. Wie kann ich überprüfen, ob ich am Ende der Zeile bin, bevor ich einen anderen Int gelesen habe?

Antwort

3

Sie sollten den Fehlerstatus des Streams mit in.clear(); nach der Schleife löschen, dann wird der Strom wieder als ob kein Fehler passiert.

Sie können auch Ihre Schleife vereinfachen:

while (in >> v) { 
    cout << v << " "; 
} 
in.clear(); 

Der Strom Extraktion zurückkehrt, wenn die Operation erfolgreich war, so können Sie dies testen direkt ohne in.good(); explizit zu überprüfen.

+0

Es ist möglich, dass ein gültiges int sofort vom Dateiende gefolgt wird. Um dies als Erfolg zu analysieren, müssen Sie in.fail() für false einchecken, da in.good() false zurückgibt, wenn das Ende der Datei erreicht wird, selbst wenn die Extraktion erfolgreich war. –

+0

Interessante Charles! –

+0

@Charles: Der implizite 'Operator void *' ruft 'fail' auf, also' while (in >> v) 'wird gelingen, wenn die Extraktion erfolgreich ist, unabhängig vom EOF-Zustand. – dalle

16

Use() ignorieren alles, bis zur nächsten Zeile zu ignorieren:

in.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 

Wenn Sie müssen es nur überprüfen othe Zeichen manuell tun, wenn zu sehen ist '\ n'

char next; 
while(in.get(next)) 
{ 
    if (next == '\n') // If the file has been opened in 
    { break;  // text mode then it will correctly decode the 
    }     // platform specific EOL marker into '\n' 
} 
// This is reached on a newline or EOF 

Dies ist wahrscheinlich scheitern, weil Sie suchen, bevor Sie die schlechten Bits löschen.