PHuV
Banned
- Registriert
- März 2005
- Beiträge
- 14.219
Ich muß gerade nach jahrelanger Nutzung mit Notepad++ feststellen, daß dieser Editor Dateien nicht explizit mit einem Zeilenende (Windows 0d0a /r/n bzw. Carriage Return/Linefeed, und unter UNIX 0a /n bzw. Linefeed) abschließt. Andere Editoren wie Windows Editor bzw. Notepad speichert auch kein Dateiende. Als langjähriger vi-Benutzer bin ich es eigentlich gewohnt, daß ein Editor eine Datei immer korrekt abschließt. Sprich, selbst wenn man am Zeilenende ist, und kein Return drückt, findet sich am Ende ein 0a. Genauso arbeiten die Editoren unter UINX/Linux hier korrekt, es findet sich immer ein Zeilenende als Dateiabschluß.
Dadurch, daß ich selten Daten mit einem Windows Editor erzeuge, ist mir das so noch nicht aufgefallen. Sonst erzeuge ich CSV und Co generativ mit Unix/Linux Befehlen oder unter Windows mit Cygwin\CMD. Hier arbeitet Windows auch korrekt, in
findet sich in der Datei ein einwandfreies 0d0a.
Warum ist das so? Eine übliche Textdatei ohne ein Zeilenende ist doch nach meinem bisherigen Verständnis ein inkonsistenter Zustand, siehe auch Definition Zeilenumbruch? Alle entsprechenden Programmiersprachen und APIs, die zeilenweise einlesen und mit den Zeilenende rechnen müssen, haben dann ein Problem, siehe Beispiel:
Es fehlt der letzte Wert in der Zeile. Jeder, der mal nativ Dateien einlesen mußte (C, C++, Java...) und sich mit fseek und Co. rumplagen mußte, weiß ja, daß wenn kein expliziter Zeitentrenner vorhanden ist, viele C-Leseroutinen und -abfragen ganz einfach fehlschlagen.
Das Problem ist jetzt mal hochgekocht, weil ein Kollegen die Dateien per Hand in einem Editor änderte, und vergaß, am Zeilenende nochmal eine Return einzufügen. Das passiert an sich immer nur Windows-Kollegen, und EMACS-Nutzern unter Unix.
Wie seht Ihr das? BTW habe ich im Notepad++ auf die Schnelle keine Option gefunden, explizit einen Zeilentrenner am letzten Zeichen der Datei zu erzwingen.
Dadurch, daß ich selten Daten mit einem Windows Editor erzeuge, ist mir das so noch nicht aufgefallen. Sonst erzeuge ich CSV und Co generativ mit Unix/Linux Befehlen oder unter Windows mit Cygwin\CMD. Hier arbeitet Windows auch korrekt, in
Code:
echo "Hallo" >C:\test.txt
Warum ist das so? Eine übliche Textdatei ohne ein Zeilenende ist doch nach meinem bisherigen Verständnis ein inkonsistenter Zustand, siehe auch Definition Zeilenumbruch? Alle entsprechenden Programmiersprachen und APIs, die zeilenweise einlesen und mit den Zeilenende rechnen müssen, haben dann ein Problem, siehe Beispiel:
Code:
[root@host~]# cat test5.txt
test1
test2
test3[root@host~]# while read a
> do
> echo $a
> done <test5.txt
test1
test2
[root@host~]#
Das Problem ist jetzt mal hochgekocht, weil ein Kollegen die Dateien per Hand in einem Editor änderte, und vergaß, am Zeilenende nochmal eine Return einzufügen. Das passiert an sich immer nur Windows-Kollegen, und EMACS-Nutzern unter Unix.
Wie seht Ihr das? BTW habe ich im Notepad++ auf die Schnelle keine Option gefunden, explizit einen Zeilentrenner am letzten Zeichen der Datei zu erzwingen.