Ändern von std :: endl, um CR + LF anstelle von LF zu löschen

8

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.

  1. Gibt es eine Möglichkeit, std::endl so zu ändern, dass CR + LF anstelle von LF als Zeilenvorschub verwendet wird?
  2. Ich weiß, dass ich meinen eigenen benutzerdefinierten Manipulator wie 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.

    
J. Polfer 30.10.2009, 19:50
quelle

5 Antworten

8

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.

    
Josh Kelley 30.10.2009, 19:58
quelle
9

std::endl ist grundlegend:

%Vor%

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.

    
ebo 30.10.2009 19:55
quelle
4

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.

    
Greg Hewgill 30.10.2009 19:59
quelle
2

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.

    
zumalifeguard 30.10.2009 19:57
quelle
0

Hier war meine Lösung für das Problem. Es ist ein bisschen Mash-up aller Informationen in den Antworten zur Verfügung gestellt:

  1. Ich habe ein Makro in einer win_endl.h-Datei für die gewünschte neue Zeile erstellt:

    %Vor%
  2. Dann habe ich eine Suche-und-ersetzen:

    %Vor%

Und sichergestellt, dass alle meine Dateien enthalten win_endl.h .

    
J. Polfer 30.10.2009 21:24
quelle

Tags und Links