Por que é recomendável ter uma linha vazia no final de um arquivo de origem?

232

Algumas ferramentas de estilo de código recomendam isso e lembro-me de ver algumas ferramentas de linha de comando unix alertando sobre a falta de linha vazia.

Qual o motivo de ter uma linha extra vazia?

Petteri Hietavirta
fonte
7
Algumas ferramentas falharão se o arquivo não terminar com uma nova linha. Isso é diferente de ter uma linha vazia no final (que seria duas linhas novas).
William Pursell
2
Você quer dizer linha vazia ( \n\n) ou nova linha \n?
Ciro Santilli escreveu
13
cato arquivo em um shell e você saberá o porquê. Se o seu arquivo fizer com que o prompt do meu shell apareça em qualquer outro lugar que não o local (no início da linha), provavelmente odeio você. ;)
ThiefMaster
2
Me deparei com essa pergunta antiga e simplesmente não consigo acreditar que todas as respostas tentam justificar as falhas e deficiências de outras ferramentas e sistemas dizendo que os codificadores modernos devem adicionar um caractere que não tem valor no próprio código. Fale sobre 5 macacos em uma gaiola! :-D
Amos M. Carpenter
1
Respostas melhores (mais gerais) dos arquivos de texto em geral :: stackoverflow.com/questions/729692/…
Ruben Bartelink

Respostas:

188

Muitas ferramentas antigas se comportam mal se a última linha de dados em um arquivo de texto não for finalizada com uma combinação de nova linha ou retorno de carro / nova linha. Eles ignoram essa linha, pois termina com ^ Z (eof).

Ralph M. Rickenbach
fonte
1
Obrigado pela resposta! Algum exemplo de ferramentas populares que podem exibir esse comportamento?
Nick Merrill
8
@NickM Quase todas as ferramentas de linha de comando POSIX / Unix que recebem entrada de texto ou lêem um arquivo de texto assumem uma linha final ( \n) no final do arquivo. Vários editores de texto, como o Vim, e vários compiladores (principalmente C ++ e Python) emitem avisos. ( 'S Em caso de C ++, a norma exige explicitamente este.)
greyfade
5
Então, o que você está dizendo é ... é um culto à carga
Jaykul
No entanto, você pode ter texto na última linha, a pergunta menciona uma linha vazia \n\n.
jinawee
57

Se você tentar concatenar dois arquivos de texto juntos, ficará muito mais feliz se o primeiro terminar com um caractere de nova linha.

user1809090
fonte
38

Além do fato de ser uma posição mais agradável do cursor quando você move para o final de um arquivo em um editor de texto.

Ter uma nova linha no final do arquivo fornece uma verificação simples de que o arquivo não foi truncado.

rsp
fonte
221
O arquivo pode ser truncado e você nunca sequer kn
Simon Nickerson
26

Também é possível argumentar para diferenças mais limpas se você anexar ao arquivo seguindo o mesmo raciocínio de Por que vírgulas finais são permitidas em uma lista?

O seguinte é copiado (e aparado um pouco) do recurso vinculado:

Alterando:

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

para:

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

envolve apenas uma alteração de uma linha no diff:

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

Isso supera a diferença de várias linhas mais confusa quando a vírgula à direita foi omitida:

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]
Mathias Bak
fonte
As respostas somente de link não são consideradas valiosas no SO. Copie as informações relevantes aqui, mantendo a atribuição.
Isherwood
17

A linha vazia no final do arquivo aparece para que a leitura padrão do fluxo de entrada saiba quando finalizar a leitura; geralmente retorna EOF para indicar que você chegou ao final. A maioria dos idiomas pode lidar com o marcador EOF. É por esse motivo que desde os tempos antigos, no DOS, o marcador EOF era a tecla F6 ou Ctrl-Z, para sistemas * nix, era Ctrl-D.

A maioria, se não todas, realmente lerá até o marcador EOF, para que a função de leitura da entrada da biblioteca de tempo de execução saiba quando parar de ler mais. Quando você abre o fluxo para o modo Anexar, ele limpa o marcador EOF e o grava além dele, até que um fechamento seja explicitamente chamado no qual ele será inserido nesse marcador.

As ferramentas mais antigas esperavam uma linha vazia seguida pelo marcador EOF. Atualmente, as ferramentas podem lidar com a linha vazia e ignorá-la.

t0mm13b
fonte
6
^ D não era "o marcador EOF". Pressionar ^ D fez com que o shell fechasse o lado de gravação do canal em que o grupo de processos em primeiro plano estava lendo, para que uma leitura desse canal retornasse EOF. Não há "marcador EOF".
William Pursell
@ William Pursell Você erroneamente confundiu * NIX e Windows. O Windows / DOS herdado usou absolutamente um marcador EOF (26, 0x1a) incorporado geralmente no final da maioria dos arquivos como uma reserva para compatibilidade com o antigo CP / M (quem diabos usou o CP / M depois de 1983?). Outra "diversão": em \r\nvez de \n, o DOS chama usando uma mistura de ASCIIZ e ASCII $. Pior ainda, mais tarde no Windows, normalmente, insira uma BOM (Unicode Byte Order Mark) no início da maioria dos arquivos de texto. Adorável "singularidade".
9

Além disso, quando você modifica um arquivo e acrescenta algum código no final do arquivo - diff (pelo menos git diff na configuração padrão) mostra que você alterou a última linha, enquanto a única coisa que realmente fez - adicionou um símbolo de nova linha. Portanto, os relatórios cvs se tornam menos convenientes.

prijutme4ty
fonte
5

Alguns idiomas definem seu arquivo de entrada em termos de linhas de entrada, onde cada linha de entrada é uma série de caracteres terminados por um retorno de carro. Se a gramática deles estiver definida, a última linha válida do arquivo também deverá ser encerrada por um retorno de carro.

Damien_The_Unbeliever
fonte
3

É por causa da definição do que é um arquivo de texto. Quando você cria um novo arquivo de texto em qualquer ambiente unix, o conteúdo desse arquivo é o novo caractere de linha '\ n'

Sem isso, o arquivo não é realmente identificado como um arquivo de texto. Agora, uma vez que adicionamos código a esse arquivo de texto, trata-se de não remover esta nova linha inicial que define o próprio arquivo de texto .

Victor Fernandes
fonte