Ich schreibe ein Programm auf einer Linux-Plattform, das Textdateien erzeugt, die auf einer Windows-Plattform angezeigt werden.
Wenn Sie std::endl
in ein ostream
übergeben, wird das CR-Zeichen nur für Zeilenumbrüche generiert. Natürlich sehen diese Textdateien in MS Notepad falsch aus.
std::endl
so zu ändern, dass CR + LF anstelle von LF als Zeilenvorschub verwendet wird? win_endl
schreiben könnte, um meine eigenen Zeilenumbrüche zu erzeugen, aber ich benutze das std::endl
-Symbol an vielen Stellen und tendiere wie viele Programmierer dazu, das Ding zu machen das erfordert die geringstmögliche Arbeit. Könnte ich einfach std::endl
überladen, um CR + LF zu erzeugen, oder ist das eine dumme Idee für Wartbarkeit? Hinweis: Ich habe diese Frage überprüft, aber es fragt sich in die andere Richtung zu gehen, und die akzeptierte Antwort scheint eher unvollständig zu sein.
Wenn Sie eine Datei im Textmodus öffnen, sollte std::endl
in die entsprechende Zeilenendung für Ihre Plattform konvertiert werden. Ihr Problem ist, dass newline für Ihre Plattform geeignet ist, aber die von Ihnen erstellten Dateien sind nicht für Ihre Plattform gedacht.
Ich bin mir nicht sicher, wie Sie das Überladen oder Ändern von endl
planen, und das Ändern des Verhaltens wäre sicherlich überraschend für neue Entwickler Ihres Projekts. Ich würde empfehlen, zu win_endl zu wechseln (sollte ein einfaches Suchen und Ersetzen sein) oder vielleicht von einem Standard ostream
zu einem Boost.Iostreams Filter-Stream , um die Konvertierung für Sie durchzuführen.
std::endl
ist grundlegend:
Also benutze stattdessen "\r\n"
und lasse den Flush weg. Es ist auch schneller so!
Aus der ostream-Headerdatei auf endl:
Dieser Manipulator wird oft irrtümlich verwendet, wenn eine einfache neue Zeile gewünscht wird, was zu einer schlechten Pufferungsleistung führt.
Windows Notepad ist so ziemlich das einzige Windows-Programm, das Sie finden, das LF-only-Dateien nicht richtig behandelt. Fast alles andere (einschließlich WordPad) verarbeitet nur LF-Dateien.
Dieses Problem ist ein Fehler im Editor.
Sie sollten \ r \ n nicht verwenden. Verwenden Sie einfach \ n, aber öffnen Sie dann den Stream im "Text" -Modus, der dann die Konvertierung für Sie übernimmt. Sie interessieren sich möglicherweise nicht für plattformübergreifend, aber das ist die offizielle Art, es zu tun.
Auf diese Weise wird der gleiche Code \ n unter Unix, \ r \ n unter Windows und auf Mac heruntergespielt.
Hier war meine Lösung für das Problem. Es ist ein bisschen Mash-up aller Informationen in den Antworten zur Verfügung gestellt:
Ich habe ein Makro in einer win_endl.h-Datei für die gewünschte neue Zeile erstellt:
%Vor%Dann habe ich eine Suche-und-ersetzen:
%Vor% Und sichergestellt, dass alle meine Dateien enthalten win_endl.h
.