2030 Stimmen

Warum sollten Textdateien mit einem Zeilenumbruch enden?

Ich nehme an, dass jeder hier mit dem Sprichwort vertraut ist, dass alle Textdateien mit einem Zeilenumbruch enden sollten. Ich kenne diese "Regel" schon seit Jahren, aber ich habe mich immer gefragt, warum?

45voto

Robin Whittleton Punkte 5932

Ein anderer Anwendungsfall: wenn Ihre Textdatei versionskontrolliert ist (in diesem Fall speziell unter Git, obwohl es auch für andere gilt). Wenn Inhalte am Ende der Datei hinzugefügt werden, wird die Zeile, die zuvor die letzte Zeile war, so bearbeitet, dass sie ein Zeilenumbruchzeichen enthält. Dies bedeutet, dass blame Wenn Sie die Datei durchsuchen, um herauszufinden, wann diese Zeile zuletzt bearbeitet wurde, wird der hinzugefügte Text angezeigt, nicht die Übergabe davor, die Sie eigentlich sehen wollten.

26voto

Enlico Punkte 17132

Warum sollten Textdateien mit einem Zeilenumbruch enden?

Denn das ist die vernünftigste Entscheidung, die man treffen kann.

Nehmen Sie eine Datei mit dem folgenden Inhalt,

one\n
two\n
three

donde \n bedeutet ein Zeilenumbruchszeichen, das unter Windows \r\n ein Return-Zeichen gefolgt von einem Zeilenvorschub, weil das so cool ist, oder?

Wie viele Zeilen hat diese Datei? Windows sagt 3, wir sagen 3, POSIX (Linux) sagt, dass die Datei verkrüppelt ist, weil es eine \n am Ende des Buches.

Unabhängig davon, was würden Sie sagen, wie lautet die letzte Zeile? Ich denke, jeder stimmt zu, dass three ist die letzte Zeile der Datei, aber POSIX sagt, dass dies eine verkrüppelte Zeile ist.

Und wie lautet die zweite Zeile? Oh, hier haben wir die erste starke Trennung :

  • Windows sagt two weil eine Datei aus "durch Zeilenumbrüche getrennten Zeilen" besteht (wieso?);
  • POSIX sagt two\n und fügte hinzu, dass dies ein echter, ehrlicher Satz ist.

Was ist dann die Konsequenz der Windows-Wahl? Ganz einfach:

Man kann nicht sagen, dass eine Datei aus Zeilen besteht

Warum? Versuchen Sie, die letzte Zeile aus der vorigen Datei zu nehmen und sie ein paar Mal zu wiederholen... Was erhalten Sie? Dies:

one\n
two\n
threethreethreethree

Versuchen Sie stattdessen, die zweite und dritte Zeile zu vertauschen... Und Sie erhalten dies:

one\n
threetwo\n

Deshalb

Sie müssen sagen, dass eine Textdatei eine Abfolge von Zeilen und \n s, das mit einer Linie beginnt und mit einer Linie endet

was ein ganz schöner Brocken ist, oder?

Und Sie wollen eine weitere seltsame Konsequenz?

Sie müssen akzeptieren, dass eine leere Datei (0 Bits) auf magische Weise immer eine einzeilige Datei ist, weil sie bei Microsoft cool sind.

Das ist ziemlich verrückt, finden Sie nicht?

Was ist die Folge der POSIX-Wahl?

Die Datei oben ist einfach ein bisschen verkrüppelt, und wir brauchen einen Hack, um damit umzugehen.

Ernst sein

Ich bin im vorangehenden Text provokativ, weil der Umgang mit Textdateien ohne die \n am Ende zwingt Sie dazu, sie mit ad-hoc Zecken/Hacks. Sie brauchen immer einen if / else Der Zweig, der sich mit der verkrüppelten Linie befasst, befasst sich nur mit der verkrüppelten Linie, alle anderen Linien nehmen den anderen Zweig. Das ist doch ein bisschen rassistisch, oder?

Meine Schlussfolgerung

Ich bin aus den folgenden Gründen für die POSIX-Definition einer Zeile:

  • Eine Datei ist natürlich als eine Folge von Zeilen konzipiert
  • Eine Zeile sollte nicht das eine oder das andere sein, je nachdem, wo sie in der Datei steht
  • Eine leere Datei ist keine einzeilige Datei, kommen Sie!
  • Sie sollten nicht gezwungen sein, Hacks in Ihrem Code vorzunehmen

24voto

cgp Punkte 40346

Grundsätzlich gibt es viele Programme, die Dateien nicht korrekt verarbeiten, wenn sie nicht das endgültige EOL EOF erhalten.

Der GCC warnt Sie davor, weil dies als Teil des C-Standards erwartet wird. (Abschnitt 5.1.1.2 anscheinend)

Compiler-Warnung "Kein Zeilenumbruch am Ende der Datei".

23voto

symbiont Punkte 1190

Diese Frage stelle ich mir schon seit Jahren. Aber ich bin heute auf einen guten Grund gestoßen.

Stellen Sie sich eine Datei mit einem Datensatz in jeder Zeile vor (z. B. eine CSV-Datei). Und der Computer würde die Datensätze am Ende der Datei schreiben. Doch plötzlich stürzt er ab. War denn die letzte Zeile vollständig? (keine schöne Situation)

Wenn wir aber immer die letzte Zeile abschließen, dann wissen wir das (einfach prüfen, ob die letzte Zeile abgeschlossen ist). Andernfalls müssten wir wahrscheinlich jedes Mal die letzte Zeile verwerfen, nur um sicherzugehen.

20voto

Stefan Punkte 42586

Dies stammt noch aus den Anfängen, als einfache Terminals verwendet wurden. Das Newline-Zeichen wurde verwendet, um einen "Flush" der übertragenen Daten auszulösen.

Heute ist das Zeilenumbruchzeichen nicht mehr erforderlich. Sicher, viele Anwendungen haben immer noch Probleme, wenn der Zeilenumbruch nicht vorhanden ist, aber das würde ich als Fehler in diesen Anwendungen betrachten.

Wenn Sie jedoch ein Textdateiformat haben, bei dem Sie erfordern der Zeilenumbruch, erhalten Sie eine einfache Datenüberprüfung sehr billig: wenn die Datei mit einer Zeile endet, die keinen Zeilenumbruch am Ende hat, wissen Sie, dass die Datei defekt ist. Mit nur einem zusätzlichen Byte für jede Zeile können Sie defekte Dateien mit hoher Genauigkeit und fast ohne CPU-Zeit erkennen.

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