Dateiende auf newline überprüfen und bei Fehlen einfügen



  • Wie genau kann ich das letzte Zeichen einer ASCII Datei auf eine newline überprüfen?

    std::fstream ss( file );
    ss.seekg( 0, std::ios::end-sizeof(char) );
    if( ss.get()!='\n')
    {
       ss.seekp( 0, std::ios::end );
       ss << '\n' << endl;
    }
    

    funzt leider nicht. Optimal wäre es wenn auch eine Leerzeile als gültiges Ende angesehen wird 😃 Hiermit möchte ich das Problem einiger Parser umgehen, die abstürzen sobald die letzte Anweisung in der letzten Zeile steht



  • Newliner schrieb:

    funzt leider nicht

    Bedeuted?



  • Du könntest die Datei ja zeichenweise einlesen und wenn das Dateiende erreicht ist, könntest du das letzte Zeichen überprüfen:

    char c;
    
    while(!ss.eof())
    {
        ss.get(c);
    }
    if(c!='\n')
    {
        //Keine Leere Zeile am ende
    }
    

    Das müsste so klappen. Aber vielleicht reicht es ja auch, wenn du einfach noch ein '\n' an die Datei anhängst? Dann hättest du mindestens 1 Leerzeile. (Ist zwar nicht ganz so sauber, aber vielleicht reicht das ja.)

    MfG, Jochen



  • "funzt nicht" im Sinne von: er erkennt bei mir NIE ob ein '\n' oder keins vorhanden ist



  • versuch es mal so:

    ss.seekg( -1, std::ios::end);
    


  • So kann man es z.B. machen:

    #include <fstream>
    using namespace std;
    
    int main()
    {
        char c , d = '\n'; 
    
        fstream datei("c:/testl.txt");
    
        datei.seekg(-1, ios::end);
    
        datei.read(&c, 1);
    
        if (c != d)
        {
            datei.seekp(0, ios::end);
            datei.write(&d, 1);
        }
        datei.close();
    }
    

    😉


Anmelden zum Antworten