Warum wird empfohlen, am Ende einer Quelldatei eine leere Zeile zu setzen?


232

Einige Tools im Codestil empfehlen dies, und ich erinnere mich, dass einige Unix-Befehlszeilentools vor fehlenden Leerzeilen warnen.

Was ist der Grund für eine zusätzliche leere Zeile?


7
Einige Tools funktionieren nicht, wenn die Datei nicht mit einem Zeilenumbruch endet. Das ist etwas anderes als eine leere Zeile am Ende (das wären 2 neue Zeilen).
William Pursell

2
Meinen Sie leere Zeile ( \n\n) oder neue Zeile \n?
Ciro Santilli 法轮功 冠状 病 六四 事件 13

13
catdie Datei auf einer Shell und Sie werden wissen, warum. Wenn Ihre Datei die Eingabeaufforderung meiner Shell an einer anderen Stelle als der angezeigten (am Anfang der Zeile) erscheinen lässt, werde ich Sie wahrscheinlich hassen. ;)
ThiefMaster

2
Kam über diese alte Frage und kann einfach nicht glauben, dass jede einzelne Antwort versucht, die Fehler und Mängel anderer Tools und Systeme zu rechtfertigen, indem sie sagt, dass moderne Codierer ein Zeichen hinzufügen sollten, das im Code selbst keinen Wert hat. Sprechen Sie über 5 Affen in einem Käfig! :-D
Amos M. Carpenter

1
Bessere (allgemeinere) Antworten auf Textdateien im Allgemeinen :: stackoverflow.com/questions/729692/…
Ruben Bartelink

Antworten:


188

Viele ältere Tools verhalten sich schlecht, wenn die letzte Datenzeile in einer Textdatei nicht mit einer Kombination aus Zeilenumbruch oder Wagenrücklauf / neuer Zeile beendet wird. Sie ignorieren diese Zeile, da sie stattdessen mit ^ Z (eof) abgeschlossen wird.


1
Danke für die Antwort! Gibt es Beispiele für beliebte Tools, die dieses Verhalten aufweisen könnten?
Nick Merrill

8
@NickM Fast alle POSIX / Unix-Befehlszeilentools, die Texteingaben vornehmen oder eine Textdatei lesen, setzen ein Zeilenende ( \n) am Dateiende voraus . Mehrere Texteditoren wie Vim und mehrere Compiler (insbesondere C ++ und Python) geben Warnungen aus. (Im Fall von C ++ verlangt der Standard dies ausdrücklich.)
greyfade

5
Also, was Sie sagen, ist ... es ist ein Frachtkult
Jaykul

Sie könnten jedoch Text in der letzten Zeile haben, die Frage erwähnt eine leere Zeile \n\n.
Jinawee

57

Wenn Sie versuchen, zwei Textdateien miteinander zu verknüpfen, sind Sie viel glücklicher, wenn die erste mit einem Zeilenumbruch endet.


38

Abgesehen von der Tatsache, dass es eine schönere Cursorposition ist, wenn Sie in einem Texteditor an das Ende einer Datei gehen.

Wenn Sie am Ende der Datei einen Zeilenumbruch haben, können Sie auf einfache Weise überprüfen, ob die Datei nicht abgeschnitten wurde.


221
Die Datei könnte abgeschnitten werden und Sie würden nie wissen
Simon Nickerson

26

Es kann auch ein Argument für sauberere Unterschiede angeführt werden, wenn Sie an die Datei anhängen und dabei die gleichen Überlegungen wie Warum sind nachgestellte Kommas in einer Liste zulässig?

Folgendes wird aus der verknüpften Ressource kopiert (und ein wenig gekürzt):

Ändern:

s = [
  'manny',
  'jack',
]

zu:

s = [
  'manny',
  'jack',
  'roger',
]

beinhaltet nur eine einzeilige Änderung im Diff:

  s = [
    'manny',
    'jack',
+   'roger',
  ]

Dies übertrifft das verwirrendere mehrzeilige Diff, wenn das nachfolgende Komma weggelassen wurde:

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]

Nur-Link-Antworten werden in SO nicht als wertvoll angesehen. Bitte kopieren Sie die relevanten Informationen hier unter Beibehaltung der Zuordnung.
Isherwood

17

Die leere Zeile am Ende der Datei wird angezeigt, damit das Standardlesen aus dem Eingabestream weiß, wann der Lesevorgang beendet werden muss. In der Regel wird EOF zurückgegeben, um anzuzeigen, dass Sie das Ende erreicht haben. Die meisten Sprachen können mit dem EOF-Marker umgehen. Aus diesem Grund war der EOF-Marker seit jeher unter DOS F6-Taste oder Strg-Z, bei * nix-Systemen Strg-D.

Die meisten, wenn nicht alle, lesen tatsächlich bis zur EOF-Markierung, sodass die Funktion der Laufzeitbibliothek, aus Eingaben zu lesen, weiß, wann das Lesen beendet werden muss. Wenn Sie den Stream für den Append-Modus öffnen, wird der EOF-Marker gelöscht und darüber geschrieben, bis explizit ein Abschluss aufgerufen wird, in den der EOF-Marker an dieser Stelle eingefügt wird.

Ältere Werkzeuge erwarteten eine leere Linie, gefolgt von einem EOF-Marker. Heutzutage können Werkzeuge die leere Zeile verarbeiten und ignorieren.


6
^ D war nicht "der EOF-Marker". Durch Drücken von ^ D schloss die Shell die Schreibseite der Pipe, von der die Vordergrundprozessgruppe las, sodass ein Lesevorgang von dieser Pipe EOF zurückgab. Es gibt keinen "EOF-Marker".
William Pursell

@ William Pursell Sie haben fälschlicherweise * NIX und Windows zusammengeführt. Legacy Windows / DOS verwendete unbedingt einen EOF-Marker (26, 0x1a), der normalerweise am Ende der meisten Dateien eingebettet ist, um die Kompatibilität mit alten CP / M zu gewährleisten (Wer zum Teufel hat CP / M nach 1983 verwendet?). Anderer "Spaß": \r\nStattdessen \nruft DOS mit einer Mischung aus ASCIIZ und ASCII $ auf. Schlimmer noch, später fügt Windows normalerweise am Anfang der meisten Textdateien eine Unicode-Byte-Ordnungsmarke (BOM) ein. Schöne "Einzigartigkeit".

9

Auch wenn Sie die Datei ändern und am Ende der Datei Code anhängen - diff (zumindest git diff in der Standardkonfiguration) zeigt an, dass Sie die letzte Zeile geändert haben, während Sie als einziges tatsächlich ein Zeilenumbruchsymbol hinzugefügt haben. Daher werden Lebenslaufberichte weniger bequem.


5

Einige Sprachen definieren ihre Eingabedatei als Eingabezeilen, wobei jede Eingabezeile eine Reihe von Zeichen ist, die durch einen Wagenrücklauf abgeschlossen werden. Wenn ihre Grammatik so definiert ist, muss die letzte gültige Zeile der Datei ebenfalls durch einen Wagenrücklauf beendet werden.


3

Dies liegt an der Definition einer Textdatei. Wenn Sie eine neue Textdatei in einer Unix-Umgebung erstellen, ist der Inhalt dieser Datei das neue Zeilenzeichen '\ n'.

Ohne dies wird die Datei nicht wirklich als Textdatei identifiziert. Sobald wir dieser Textdatei Code hinzugefügt haben, geht es darum, diese erste neue Zeile, die eine Textdatei selbst definiert , nicht zu entfernen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.