¿Por qué se recomienda tener una línea vacía al final de un archivo fuente?

232

Algunas herramientas de estilo de código recomiendan esto y recuerdo haber visto algunas advertencias de herramientas de línea de comandos de Unix sobre la falta de línea vacía.

¿Cuál es el razonamiento para tener una línea vacía adicional?

Petteri Hietavirta
fuente
77
Algunas herramientas no funcionan si el archivo no termina con una nueva línea. Eso es diferente a tener una línea vacía al final (que serían 2 líneas nuevas).
William Pursell
2
¿Te refieres a línea vacía ( \n\n) o nueva línea \n?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
13
catel archivo en un shell y sabrás por qué. Si su archivo hace que el indicador de mi shell aparezca en cualquier otro lugar que no sea el que debería ser (al comienzo de la línea), probablemente lo odie. ;)
ThiefMaster
2
Encontré esta vieja pregunta y simplemente no puedo creer que cada respuesta intente justificar las fallas y las deficiencias de otras herramientas y sistemas al decir que los codificadores modernos deben agregar un carácter que no tiene valor en el código. ¡Habla de 5 monos en una jaula! :-D
Amos M. Carpenter
1
Mejores respuestas (más generales) sobre archivos de texto en general :: stackoverflow.com/questions/729692/…
Ruben Bartelink

Respuestas:

188

Muchas herramientas antiguas se comportan mal si la última línea de datos en un archivo de texto no termina con una nueva línea o una combinación de retorno de carro / nueva línea. Ignoran esa línea ya que termina con ^ Z (eof) en su lugar.

Ralph M. Rickenbach
fuente
1
¡Gracias por la respuesta! ¿Algún ejemplo de herramientas populares que puedan exhibir este comportamiento?
Nick Merrill el
8
@NickM Casi todas las herramientas de línea de comandos POSIX / Unix que toman entrada de texto o leen un archivo de texto asumen una línea que termina ( \n) al final del archivo. Varios editores de texto, como Vim, y varios compiladores (especialmente C ++ y Python) emitirán advertencias. (En el caso de C ++, el estándar lo requiere explícitamente).
greyfade
55
Entonces, lo que estás diciendo es ... es un culto de carga
Jaykul
Sin embargo, podría tener texto en la última línea, la pregunta menciona una línea vacía \n\n.
jinawee
57

Si intenta concatenar dos archivos de texto, será mucho más feliz si el primero termina con un carácter de nueva línea.

user1809090
fuente
Sin embargo, ¿cuándo concatenar archivos y no tendrá la opción de agregar nuevas líneas intermedias durante la concatenación?
Rudey hace
38

Además del hecho de que es una mejor posición del cursor cuando te mueves al final de un archivo en un editor de texto.

Tener una nueva línea al final del archivo proporciona una comprobación simple de que el archivo no se ha truncado.

rsp
fuente
221
El archivo se puede truncar y que ni siquiera sería kn
Simon Nickerson
Nada impide que un archivo tenga nuevas líneas en algún lugar en el medio, y el archivo podría truncarse fácilmente allí mismo.
Rudey hace
26

También se puede hacer un argumento para diferenciales más limpios si agrega al archivo siguiendo el mismo razonamiento que ¿Por qué se permiten las comas finales en una lista?

Lo siguiente se copia (y se recorta un poco) del recurso vinculado:

Cambiando:

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

a:

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

implica solo un cambio de una línea en el diff:

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

Esto supera la diferencia de varias líneas más confusa cuando se omite la coma final:

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]
Mathias Bak
fuente
Las respuestas de solo enlace no se consideran valiosas en SO. Copie la información relevante aquí mientras mantiene la atribución.
isherwood
17

La línea vacía al final del archivo aparece para que la lectura estándar de la secuencia de entrada sepa cuándo finalizar la lectura, generalmente devuelve EOF para indicar que ha llegado al final. La mayoría de los idiomas pueden manejar el marcador EOF. Está allí por esa razón desde los viejos tiempos, bajo DOS, el marcador EOF era la tecla F6 o Ctrl-Z, para los sistemas * nix, era Ctrl-D.

La mayoría, si no todos, leerán hasta el marcador EOF para que la función de lectura de la biblioteca en tiempo de ejecución sepa cuándo dejar de seguir leyendo. Cuando abra la secuencia para el modo Anexar, borrará el marcador EOF y escribirá más allá, hasta que se llame explícitamente un cierre en el que insertará el marcador EOF en ese punto.

Las herramientas más antiguas esperaban una línea vacía seguida de un marcador EOF. Hoy en día, las herramientas pueden manejar la línea vacía e ignorarla.

t0mm13b
fuente
66
^ D no era "el marcador EOF". Al presionar ^ D, el shell cerró el lado de escritura de la tubería desde la que estaba leyendo el grupo de proceso en primer plano, de modo que una lectura de esa tubería devolvió EOF. No hay un "marcador EOF".
William Pursell
@William Pursell Has confundido por error * NIX y Windows. Windows / DOS heredado utilizó absolutamente un marcador EOF (26, 0x1a) incrustado generalmente al final de la mayoría de los archivos como un remanente para compatibilidad con CP / M antiguo (¿Quién diablos usó CP / M después de 1983?). Otra "diversión": en \r\nlugar de \n, DOS llama usando una mezcla de ASCIIZ y ASCII $. Peor aún, más adelante, Windows generalmente inserta una marca de orden de byte Unicode (BOM) al comienzo de la mayoría de los archivos de texto. Encantadora "singularidad".
9

Además, cuando modifica el archivo y agrega algún código al final del archivo, diff (al menos git diff en la configuración estándar) mostrará que ha cambiado la última línea, mientras que lo único que ha hecho realmente es agregar un símbolo de nueva línea. Entonces los informes cvs se vuelven menos convenientes.

prijutme4ty
fuente
5

Algunos idiomas definen su archivo de entrada en términos de líneas de entrada, donde cada línea de entrada es una serie de caracteres terminados por un retorno de carro. Si su gramática está así definida, entonces la última línea válida del archivo también debe terminar con un retorno de carro.

Damien_The_Unbeliever
fuente
3

Se debe a la definición de lo que es un archivo de texto. Cuando crea un nuevo archivo de texto en cualquier entorno Unix, el contenido de ese archivo es el nuevo carácter de línea '\ n'

Sin esto, el archivo no se identifica realmente como un archivo de texto. Ahora, una vez que agreguemos código a este archivo de texto, se trata de no eliminar esta nueva línea inicial que define un archivo de texto en sí .

Victor Fernandes
fuente