Zeilenvorschub und Wagenrücklauf

8

Kürzlich habe ich mit einigen Strings, Texteingaben und ähnlichen Dingen gearbeitet, und mir wurde klar, dass ich wenig über 2 Zeichen - LF (10) und CR (13) - verwirrt habe. Jedes Mal, wenn ich eine neue Zeile starten musste, habe ich std :: endl für c ++ - String und \ n verwendet, was LF für c-Strings ist. Allerdings benutze ich jetzt eine Bibliothek, die mir beim Drücken der Return-Taste nicht LF, sondern CR-Code sendet. Ich lese auf Wikipedia, dass die Verwendung wie folgt ist:

%Vor%

Aber ich habe nie wirklich bemerkt, dass CR unter Windows benötigt wird, alles wird sowieso an der richtigen Stelle gedruckt. CR wurde, wiederum gemäß Wikipedia, in Zeiten von Schreibmaschinen benutzt, um den Schreibkopf an den Anfang der Zeile zurückzubringen, und dann LF, um eine Zeile weiter zu scrollen.

Meine Frage ist, ob es heutzutage wirklich notwendig ist, CR zu verwenden und warum. Welche Systeme könnten möglicherweise nicht korrekt Text ausgeben, wenn nur LF verwendet wird? Benötigen Drucker noch CR und wenn ja, interpretiert das Betriebssystem automatisch LF als neue Zeile und kehrt zum Anfang der Zeile zurück oder CR muss in Daten, die ich zum Drucken gesendet habe, immer noch fest codiert sein.

    
Raven 10.09.2011, 13:29
quelle

1 Antwort

11

Innerhalb Ihrer C- und C ++ - Programme benötigen Sie (zumindest wenn Sie nur mit der Standardbibliothek arbeiten) \n , die beim Senden an einen beliebigen C / C ++ - Stream im Textmodus geöffnet werden (dh wenn Sie b nicht in fopen und ios::bin für C ++ - Streams angeben) wird automatisch in den Zeilenabschluss der aktuellen Plattform übersetzt. Deshalb kannst du unter Windows einfach \n in irgendeinen Stream schreiben und es wird "magisch" CRLF in die Datei / auf der Konsole.

Zu diesem Zweck existiert die ganze binäre / Textmodus-Sache: Wenn Sie eine Textdatei schreiben, ist es nützlich, diese Übersetzung zu haben (auf diese Weise können Sie \n als Zeilenabschluss verwenden, ohne sich um die spezifische Plattform kümmern zu müssen) line terminator), aber wenn Sie eine Binärdatei schreiben, ist \n nur ein Byte wie die anderen und sollte nicht übersetzt werden, sonst erhalten Sie beschädigte Daten.

* NIX-Systeme, die nur LF verwenden (was \n ist), führen keine Übersetzung durch, aber es ist immer noch gut, den Binär / Text-Modus für Portabilitäts- / Klarheitszwecke korrekt anzugeben.

Die Verwendung von immer endl in C ++ ist ein häufiger Fehler, \n reicht aus, um die Übersetzung in den plattformspezifischen Zeilenabschluss zu bringen.

Was endl mehr tut als \n ist das Löschen des Stream-Puffers, was unter bestimmten Umständen nützlich sein kann (zB die Ausgabe von etwas auf einer Konsole vor einer langen Operation), aber im Allgemeinen nur die IO verlangsamen ( auf Konsolen ist es normalerweise nicht bemerkbar, aber auf Dateien ist es). Normalerweise verwende ich nur \n und füge ein std::flush hinzu, wenn ein Flush tatsächlich benötigt wird.

Dies betrifft die Standardbibliothek; im Umgang mit anderen Bibliotheken YMMV und Sie sollten ihre Dokumentation zu sehen, ob sie die Standard-C-Konvention zu folgen oder sie benötigen Zeichenfolgen, um die Plattform-spezifische Linie Terminator enthalten.

    
Matteo Italia 10.09.2011, 13:38
quelle

Tags und Links