std::ofstream verdoppelt newlines?



  • Habe einen sehr komischen Fehler.

    wxMessageBox(code.c_str());
            std::ofstream out(fn.c_str(),std::ios::out);//fn = filename/path
            out << code.c_str();
    

    code enthält text, welcher mehrere Zeilen lang ist.
    Wenn ich den Text mit der MessageBox ausgeben lasse ist alles ok, aber wenn ich ihn in die Datei schreibe, dann wird aus (fast) jedem \n ein \n\n.
    Andere Fehlerquellen konnte ich bereits ausschließen, die Anzeige in einem TextCtrl ist auch korrekt, und die MessageBox zeigt das die new lines nicht im String sein sollten.
    Also, wo kommen sie her?

    phlox



  • Klingt für mich wie ein typischer LineFeed/CarriageReturn-Fehler. Windows?



  • Fellhuhn schrieb:

    Klingt für mich wie ein typischer LineFeed/CarriageReturn-Fehler. Windows?

    Ja, ist Windows (MinGW). Alle newlines sind \n und hab auch schon im Hexeditor nachgesehen, ob die nicht nach \r\n umgewandelt werden, tun sie nicht, es sind \n\n.
    So ganz kann ich es mir auch nicht erklären, habe ähnliche sachen ja schon häufiger gemacht.


  • Administrator

    Schon mal probiert std::ios::binary mitanzugeben? Dies sollte verhindern, dass automatisch Zeichen hinzugefügt/uminterpretiert werden.
    Aber nachvollziehen kann ich den Fehler nicht wirklich, da ich ihn nicht reproduzieren kann. Kannst du uns einen kurzen Code geben, wo man dies reproduzieren kann?

    Grüssli



  • Dravere schrieb:

    Schon mal probiert std::ios::binary mitanzugeben? Dies sollte verhindern, dass automatisch Zeichen hinzugefügt/uminterpretiert werden.
    Aber nachvollziehen kann ich den Fehler nicht wirklich, da ich ihn nicht reproduzieren kann. Kannst du uns einen kurzen Code geben, wo man dies reproduzieren kann?

    Grüssli

    Binary tuts tatsächlich beheben 🙂
    Allerdings hatte ich das für unnötig gehalten, da es ja eh schon "nur" text ist. nix binäres. 😉


  • Administrator

    phlox81 schrieb:

    Allerdings hatte ich das für unnötig gehalten, da es ja eh schon "nur" text ist. nix binäres. 😉

    Naja, was ist Text? Text ist auch etwas binäres. std::ios::binary sagt grundsätzlich einfach nur "Schreib es rein, wie du es bekommst!" oder umgekehrt "Lies es, wie es dort steht!". Ohne std::ios::binary darf die Implementierung selber Veränderungen und Anspassungen vornehmen. So kann zum Beispiel auch auf das EOF Zeichen in einem File reagiert werden, also dass das std::ios::eofbit Flag gesetzt wird, obwohl eigentlich noch Daten im File drin wären.

    Grüssli


Anmelden zum Antworten