2 Stimmen

Zeilenumbruch erforderlich beim Drucken auf der Konsole in Windows?

Anscheinend reicht es aus, einfach Zeilenumbruch einzufügen, aber ich weiß, dass es eigentlich Wagenrücklauf + Zeilenumbruch sein soll. Passiert etwas Schreckliches, wenn man keinen Wagenrücklauf einfügt und nur Zeilenumbrüche verwendet?

Das ist in ANSI C und wird nicht in eine Datei oder etwas anderes umgeleitet. Nur eine normale Konsolenanwendung.

2voto

RBerteig Punkte 39719

Die Windows-Konsole folgt der gleichen Zeilenendekonvention, die für Dateien angenommen wird, oder um genau zu sein, für tatsächliche physische Terminals. Sie benötigt sowohl CR als auch LF, um ordnungsgemäß zur nächsten Zeile zu wechseln.

Davon abgesehen gibt es eine Menge Softwareinfrastruktur zwischen einem ANSI-C-Programm und dieser Konsole. Insbesondere wird jeder Standard-C-Bibliotheks-E/A-Funktion versuchen, das Richtige zu tun, vorausgesetzt, Sie haben ihm die Chance dazu gegeben. Deshalb wurden die t und b Modifikatoren für den mode-Parameter bei fopen() definiert.

Mit t (der Standard für die meisten Streams, insbesondere für stdin und stdout) wird jede gedruckte \n Sequenz in eine CRLF-Sequenz konvertiert, und umgekehrt passiert dies bei Lesevorgängen. Um dieses Verhalten auszuschalten, verwenden Sie den b Modifikator.

Übrigens benötigen die Terminals, die traditionell an *nix-Boxen angeschlossen sind, einschließlich des von XTerm emulierten DEC VT100, ebenfalls sowohl CR als auch LF. Allerdings wird in der *nix-Welt die Umwandlung eines Newline-Zeichens in eine CRLF-Sequenz im tty-Gerätetreiber behandelt, damit die meisten Programme nichts darüber wissen müssen, und die Modifikatoren t und b werden beide ignoriert. Auf diesen Plattformen müssen Sie, wenn Sie Zeichen auf einem tty senden und empfangen müssen, ohne diese Modifikation, stty(1) oder die davon abhängigen Systemaufrufe konsultieren.

Wenn Ihr ansonsten ANSI-C-Programm die C-Bibliotheks-E/A zur Konsole vermeidet (vielleicht weil Sie Zugriff auf die Zeichenfarbe der Konsole und andere Attribute benötigen), dann hängt es davon ab, welche Win32-API-Aufrufe Sie verwenden, um die Zeichen zu senden, ob Sie CR senden müssen oder nicht.

1voto

Bennett Dill Punkte 2855

Wenn Sie sich in einer *nix-Umgebung befinden, ist wahrscheinlich \ n (Zeilenumbruch) in Ordnung. Wenn Sie in Windows sind und nicht umleiten (jetzt) ist auch ein Zeilenumbruch in Ordnung, aber wenn jemand irgendwann umleitet, :-(

Wenn Sie jedoch Windows verwenden, kann es Probleme geben, wenn die Ausgabe in eine Textdatei umgeleitet wird und dann ein anderer Prozess versucht, die Daten zu verarbeiten.

Die Konsole weiß, was angezeigt werden soll, aber Verbraucher könnten nicht glücklich sein...

Wenn Sie C# verwenden, könnten Sie die Umgebung.NewLine "Konstante" ausprobieren.

http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

Wenn Sie wirklich in Vanilla C sind, bleiben Sie bei \r\n. :-)

0voto

Brian R. Bondy Punkte 325712

Es hängt davon ab, wofür du sie benutzt. Einige Programme werden Zeilenumbrüche nicht korrekt anzeigen, wenn du nicht sowohl \r als auch \n verwendest.

Wenn du nur \n schreibst, könnten einige Programme, die deine Textdatei (oder Ausgabe) verarbeiten, deinen Text als eine Zeile anstelle von mehreren Zeilen anzeigen.

Es gibt auch einige Dateiformate und Protokolle, die ohne die Verwendung von sowohl \r als auch \n vollständig ungültig wären.

0voto

Mark Ransom Punkte 283960

Ich habe es schon so lange nicht mehr ausprobiert, dass ich mir nicht sicher bin, woran ich mich erinnere... aber bewegt sich nicht ein Zeilenumbruch für sich alleine nach unten, ohne zur linken Spalte zurückzukehren?

Je nach Ihrem Compiler könnte die Standardausgabe im Textmodus geöffnet werden, in diesem Fall wird ein einzelner Zeilenumbruch zu \r\n übersetzt, bevor er ausgegeben wird.

Bearbeiten: Ich habe gerade einen schnellen Test gemacht und in XP wird eine Datei ohne Zeilenrückläufe normal angezeigt. Ich weiß immer noch nicht, ob einige Compiler die Zeilenrückläufe automatisch einfügen.

0voto

Hexagon Punkte 6527

In C werden Dateien (auch "Streams" genannt) in zwei Varianten - binär oder Text - verwendet.

Die Bedeutung dieser Unterscheidung bleibt implementations-/plattformabhängig, aber unter Windows (mit den gängigen Implementierungen, die ich gesehen habe), wird beim Schreiben in Text-Streams '\n' automatisch in "\r\n" übersetzt, und beim Lesen aus Text-Streams wird "\r\n" automatisch in '\n' übersetzt.

Die "Konsole" ist tatsächlich "standard output", also ein Stream, der standardmäßig als Text-Stream geöffnet ist. Daher reicht es in der Praxis unter Windows aus, "Hello, world!\n" zu schreiben - und ist portabel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X