2017-12-30 4 views
2

Dies ist der Beispielcode aus 17 Kapitel (17.5.3) der C++ Grundierung 5th Edition Buch.C++ - Primer 5th edition Kapitel 17.5.3 fstream legt keine neue Zeile

int main(void) { 

    fstream inOut("test.txt", fstream::ate | fstream::in | fstream::out); 
    if (!inOut) 
    { 
     cerr << "Unable to open file!" << endl; 
     return EXIT_FAILURE; 
    } 

    auto end_mark = inOut.tellg(); 
    inOut.seekg(0, fstream::beg); 
    size_t cnt = 0; 
    string line; 

    while (inOut && inOut.tellg() != end_mark && getline(inOut, line)) 
    { 
     cnt += line.size() + 1; 
     auto mark = inOut.tellg(); 
     inOut.seekg(0, fstream::end); 
     inOut << cnt; 

     if (mark != end_mark) 
     { 
      inOut << " "; 
     } 

     inOut.seekg(mark); 
    } 

    inOut.seekg(0, fstream::end); 
    inOut << "\n"; 
    return 0; 
} 

Der Inhalt der Datei test.txt ist:

abcd 
efg 
hi 
j 
<This is a blank new line> 

Der Punkt ist, wenn diese Datei mit einer Leerzeile endet, dieser Code funktioniert, wie es erwartet wird. In einem anderen Wort, es wird die Datei in dem ändern:

abcd 
efg 
hi 
j 
5 9 12 14 
<This is a blank new line> 

Aber, wenn die Datei wird ausgegeben, nicht mit einer leeren neuen Zeile enden wie folgt aus:

abcd 
efg 
hi 
j5 9 12 

Beachten Sie, dass diese Datei endet nicht mit einer neuen Zeile. Meine Frage ist, wo ist die leere neue Zeile? Afterall gibt es den Code

inOut << "\n"; 

Es sollte auf jeden Fall eine neue leere Zeile setzen. Wo ist falsch?

Antwort

2

Das Problem ist, dass beim Erreichen des Dateiendes das schlechte Bit des Streams gesetzt wird. Wenn Sie

inOut.clear(); 

vor der letzten INOUT- < < „\ n“ der Neuen-Zeile hinzufügen, wird als erwartet geschrieben, obwohl die Länge der Linie, ohne eine neue Zeile weiter nicht hinzugefügt werden.

+0

Getestet. Arbeite wie ein Zauber. :) Ich wiederhole das Kapitel 8 (8.1.2), es erwähnt dies. – callofdutyops