Penultimo caracter de um arquivo

Penultimo caracter de um arquivo

por Henrique Stagni -
Número de respostas: 2
Ao ler um arquivo de texto acontece o seguinte:
 +O ultimo caracter que é lido é o correspondente ao EOF  (-1)
 +Mas o penultimo caracter que é lido é sempre uma quebra de linha de valor (10)

Todo arquivo de texto que leio apresenta esta quebra de linha no final.
Isso é normal?
Em resposta à Henrique Stagni

Re: Penultimo caracter de um arquivo

por Francisco Reverbel -
É normal sim. Como o caractere '\n' ("new line", ou "line feed", ou LF -- código decimal 10 da tabela ASCII) é terminador de linhas, todas as linhas de texto (inclusive a última!) acabam com um '\n'. Por definição, uma linha de texto é uma seqüência de caracteres terminada por um '\n'.

Note que é muito fácil criar um arquivo de texto no qual a última "linha" não acaba com '\n', ou seja, ela não é uma linha de verdade. Basta chamar um editor de texto como o emacs, criar um novo arquivo, digitar algum texto, não digitar ENTER no final da última "linha" e salvar o arquivo. Embora seja perfeitamente possível fazer isso, em geral se considera que criar arquivos de texto sem um '\n' ao final da última "linha" é uma prática ruim. Muitos programas reclamam ao encontrar um arquivo assim. O gcc, por exemplo, dá o aviso

warning: no newline at end of file

Se você usar chamar o programa wc para contar as linhas de um arquivo desses (com "wc -l <nome_do_arquivo" ou "wc -l nome_do_arquivo"), verá que a "linha final" não é contada.

Ah, é bom deixar claro que o uso do caractere '\n' como terminador de linhas não é uma convenção universal. Isso é a tradição no sistema Unix e nos seus derivados, como o Linux. Nos sistemas da Microsoft a tradição é usar o par de caracteres CR e LF como terminador de linhas. Isso é uma herança do tempo em que os dispositivos de impressão eram parecidos com as velhas máquinas de escrever, que recebiam comandos diferentes para voltar o "carro impressor" para a margem esquerda ("carriage return", ou CR) e para avançá-lo para a linha seguinte ("line feed", ou LF). Essa diferença entre as convenções para arquivos texto do Unix/Linux e da Microsoft é uma fonte bem conhecida de dores de cabeça.

Em resposta à Henrique Stagni

Re: Penultimo caracter de um arquivo

por Luciano Ramalho -
Um programinha útil no Linux para inspecionar exatamente o contedeúdo de um arquivo é o xxd. Ele faz um "hex dump", ou seja, exibe todos os bytes do arquivo em hexadecimal, com uma coluna lateral que mostra também o caractere ASCII correspondente a cada byte.

Veja este exemplo, de um arquivo gerado sem newline no final, conforme explicado pelo Prof. Reverbel:

$ xxd ent_enunciado.txt 
0000000: 6c65 3d30 3b77 6869 6c65 286c 653d 3d30  le=0;while(le==0
0000010: 297b 6869 3d30 3b77 6869 6c65 2868 693d  ){hi=0;while(hi=
0000020: 3d30 297b 6869 3d                        =0){hi=
$

[ ]s

Luciano