Perché si consiglia di avere una riga vuota alla fine di un file di origine?


232

Alcuni strumenti in stile codice lo consigliano e ricordo di aver visto alcuni strumenti della riga di comando unix avvisare della mancanza di una riga vuota.

Qual è il ragionamento per avere una riga vuota in più?


7
Alcuni strumenti non funzionano se il file non termina con una nuova riga. Ciò è diverso dall'avere una riga vuota alla fine (che sarebbe 2 nuove righe).
William Pursell,

2
Vuoi dire linea vuota ( \n\n) o nuova linea \n?
Ciro Santilli 13 冠状 病 六四 事件 法轮功

13
catil file su una shell e saprai perché. Se il tuo file fa apparire il prompt della mia shell in un posto diverso da quello che dovrebbe essere (all'inizio della riga) probabilmente ti odierò. ;)
ThiefMaster il

2
Sono arrivato a questa vecchia domanda e semplicemente non riesco a credere che ogni singola risposta cerchi di giustificare i fallimenti e le carenze di altri strumenti e sistemi dicendo che i programmatori moderni dovrebbero aggiungere un carattere che non ha valore nel codice stesso. Parla di 5 scimmie in una gabbia! MrGreen
Amos M. Carpenter il

1
Meglio risposte (più generali) con riferimento a file di testo in generale :: stackoverflow.com/questions/729692/...
Ruben Bartelink

Risposte:


188

Molti strumenti meno recenti si comportano in modo anomalo se l'ultima riga di dati in un file di testo non termina con una nuova riga o una combinazione di ritorno a capo / nuova riga. Ignorano quella linea poiché è invece terminata con ^ Z (eof).


1
Grazie per la risposta! Qualche esempio di strumenti popolari che potrebbero mostrare questo comportamento?
Nick Merrill,

8
@NickM Quasi tutti gli strumenti da riga di comando POSIX / Unix che accettano input di testo o leggono un file di testo assumono una riga che termina ( \n) alla fine del file. Diversi editor di testo, come Vim, e diversi compilatori (in particolare C ++ e Python) emetteranno avvisi. (Nel caso di C ++, lo standard lo richiede esplicitamente.)
greyfade,

5
Quindi quello che stai dicendo è ... è un culto del carico
Jaykul,

Eppure potresti avere del testo sull'ultima riga, la domanda menziona una riga vuota \n\n.
jinawee,

57

Se provi a concatenare due file di testo insieme, sarai molto più felice se il primo termina con un carattere di nuova riga.


38

A parte il fatto che si tratta di una posizione del cursore più bella quando ci si sposta alla fine di un file in un editor di testo.

Avere una nuova riga alla fine del file fornisce un semplice controllo che il file non è stato troncato.


221
Il file potrebbe essere troncato e non ti saresti mai imbrogliato
Simon Nickerson, il

26

Un argomento può anche essere fatto per differenze più pulite se si accoda al file seguendo lo stesso ragionamento di Perché le virgole finali sono consentite in un elenco?

Quanto segue viene copiato (e tagliato un po ') dalla risorsa collegata:

Mutevole:

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

per:

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

comporta solo una modifica di una riga nel diff:

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

Questo batte il diff di più righe più confuso quando la virgola finale è stata omessa:

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

Le risposte solo link non sono considerate utili su SO. Copia le informazioni pertinenti qui mantenendo l'attribuzione.
Isherwood,

17

La riga vuota alla fine del file appare in modo che la lettura standard dal flusso di input sappia quando terminare la lettura, di solito restituisce EOF per indicare che hai raggiunto la fine. La maggior parte delle lingue può gestire il marker EOF. È lì per quel motivo ai vecchi tempi, sotto DOS, il marker EOF era il tasto F6 o Ctrl-Z, per i sistemi * nix, era Ctrl-D.

La maggior parte, se non tutte, in realtà leggerà fino al marker EOF in modo che la funzione della libreria di runtime di leggere dall'input sappia quando smettere di leggere ulteriormente. Quando si apre lo stream per la modalità Append, si cancellerà il marker EOF e si passerà sopra di esso, fino a quando non viene esplicitamente chiamato una chiusura in cui verrà inserito il marker EOF in quel punto.

Gli strumenti più vecchi si aspettavano una linea vuota seguita dal marker EOF. Al giorno d'oggi, gli strumenti possono gestire la linea vuota e ignorarla.


6
^ D non era "il marker EOF". Premendo ^ D, la shell ha chiuso il lato di scrittura della pipe da cui stava leggendo il gruppo di processi in primo piano, in modo che una lettura da quella pipe restituisse EOF. Non esiste un "marker EOF".
William Pursell,

@William Pursell Hai confuso erroneamente * NIX e Windows. Windows / DOS legacy usavano assolutamente un marcatore EOF (26, 0x1a) incorporato di solito alla fine della maggior parte dei file come supporto per la compatibilità con CP / M antico (chi diamine usava CP / M dopo il 1983?). Altro "divertimento": \r\ninvece di \n, le chiamate DOS utilizzano un mix di ASCIIZ e ASCII $. Ancora peggio, in seguito Windows di solito inserisce un segno di ordine dei byte Unicode (BOM) all'inizio della maggior parte dei file di testo. Adorabile "unicità".

9

Anche quando modifichi un file e aggiungi un po 'di codice alla fine del file - diff (almeno git diff nella conigurazione standard) mostrerà che hai cambiato l'ultima riga, mentre l'unica cosa che hai effettivamente fatto - ha aggiunto un simbolo di nuova riga. Quindi i rapporti cvs diventano meno convenienti.


5

Alcune lingue definiscono il loro file di input in termini di righe di input, in cui ogni riga di input è una serie di caratteri terminata da un ritorno a capo. Se la loro grammatica è così definita, anche l'ultima riga valida del file deve essere terminata da un ritorno a capo.


3

È a causa della definizione di cosa sia un file di testo. Quando si crea un nuovo file di testo in qualsiasi ambiente unix, il contenuto di quel file è il carattere di nuova riga '\ n'

Senza questo, il file non è realmente identificato come un file di testo. Ora, una volta aggiunto il codice a questo file di testo, si tratta di non rimuovere questa nuova riga iniziale che definisce un file di testo stesso .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.