Zeilenende UNIX/DOS
Stefan
- perl
Hallo,
ich schreibe (unter Windows) ein Perl-CGI, welches unter Unix laufen soll. Ich schreibe eine Datei, die auf UNIX mit CRLF enden muss. (Ich weiss, ist komisch, aber "jemand" will das so...)
print "Text\015\012";
schreibt Zeilen mit Zeilenende 0D0D0A (DOS)
print "Text$CRLF";
(unter Verwendung von "use Socket")
schreibt Zeilen mit Zeilenende 0D0D0A (DOS)
print "Text\n";
schreibt Zeilen mit Zeilenende 0D0A (DOS) aber leider nur 0A (UNIX)
Was muss ich machen, um auf beiden Systemen 0D0A zu erhalten?
Danke fuer Eure Hilfe,
Stefan
Moin Moin !
open FILE,">output.file" or die $!;
binmode FILE;
print FILE "Zeile 1 und \015\012Zeile 2, beide mit Oktal-Angaben.\015\012";
print FILE "Zeile 3 und \r\nZeile 4, beide mit Escapes (etwas unsauber, aber so lange es bei Unix und Windows bleibt, korrekt).\r\n";
close FILE;
Alexander
Hallo Alexander,
heisst das ich muss das im binmode machen, obwohl es eigentlich ein Textfile ist?
Stefan
Moin Moin !
heisst das ich muss das im binmode machen, obwohl es eigentlich ein Textfile ist?
Wenn Du darauf bestehst, ein u.U. OS-fremdes Zeilenende zu haben: Ja.
Du kannst Dir vielleicht das Leben wesentlich leichter machen, wenn Du zum Transfer der Text-Dateien FTP im ASCII-Mode (im Gegensatz zum Binär-Mode) benutzt, dann werden die Zeilenenden beim Transfer automatisch an das jeweilige OS angepaßt.
Diese ganze Unterscheidung zwischen Textmode und Binärmode bei Dateien ist sowieso nur eine Spielerei der C-Runtime-Library (libc), der Betriebssystemkern arbeitet immer binär (zumindest bei Unixen aller Art, DOS und Windows).
Im Prinzip ist die libc auf Nicht-Unix-Betriebssystemen eine (sehr dünne) Emulation von Unix. Unter Unix ist das Zeilenende einer Textdatei LF ("\n"), und wenn der selbe Quelltext auch auf Nicht-Unix-Systemen ohne Änderungen laufen soll, muß eben die libc die Zeilenenden anpassen, d.h. beim Schreiben wird aus LF CR/LF unter DOS und Windows und CR auf dem Mac, und beim Lesen wird aus CR/LF unter DOS bzw CR auf dem Mac wieder ein LF ("\n"). Weil mit diesem "hochintelligenten" Algorithmus aber sämtliche Binärdateien auf Nicht-Unix-Systemen geschreddert würden, ist irgendjemand auf die Idee gekommen, zwischen Textmode und Binärmode umzuschalten.
Beschwerden bitte an Microsoft und Digital wegen der DOS- und CP/M-Zeilenenden und an Apple wegen der Mac-Zeilenenden; sowie an K&R, die uns den ganzen Ärger mit C eingebrockt haben. ;-)
Alexander