Qual é o último caractere em um arquivo?

17

Acabei de ler as respostas para "Remover um caractere de nova linha no final de um arquivo" e todos disseram para excluir o último caractere. Minha pergunta é: o último caractere não é o último?

    
por sworwitz 08.10.2016 / 18:48

3 respostas

11

Um arquivo não termina com um caractere de fim de arquivo, como as respostas anteriores afirmam corretamente. Mas acho que as respostas e comentários contêm algumas imprecisões dignas de nota:

  • O conjunto de caracteres ASCII não contém um caractere EOF exato. Existem vários caracteres de controle "final": Fim do texto (3), Fim da transmissão (4), Fim do bloco de transmissão (23), Fim do meio (25). O separador de arquivos (28) talvez se aproxime mais de um caractere EOF. Código 26 é "Substituto", não EOF.

  • Ctrl - D é associado somente à entrada do terminal. Por exemplo, o comando cat filea fileb filec > outfile não envolve Ctrl - D . A propósito, você pode mudar o caractere EOF terminal para algo diferente de Ctrl - D usando o comando stty .

  • Estritamente falando, Ctrl - D (ou o que quer que você tenha mudado) não é um código de chave EOF. O que ele faz é fazer com que a chamada do sistema read retorne com a entrada que está disponível, assim como pressionar o retorno faz a chamada do sistema de leitura retornar uma linha de caracteres ao chamador. Por convenção , um valor de retorno zero da chamada do sistema lida (ou seja, zero caracteres lidos) sinaliza uma condição de fim de arquivo. No entanto, o arquivo de entrada não é fechado automaticamente e, se a entrada vier do terminal, ela não será colocada no estado "fim do arquivo". Você pode escrever um programa que continue lendo a partir do terminal, mesmo depois de um "fim de arquivo", e a chamada de leitura pode retornar diferente de zero para a próxima linha de entrada.

  • A analogia entre os caracteres eof e eol pode ser vista se Ctrl - D for pressionado quando alguma entrada já tiver sido escrita na linha. Por exemplo, se você escrever "abc" e pressionar Ctrl - D a chamada de leitura retorna, desta vez com um valor de retorno de 3 e com "abc" armazenado no buffer passado como argumento. Como read não retorna 0, isso não é interpretado como uma condição EOF pela convenção acima. Da mesma forma, pressionar retornar para faz a chamada de leitura retornar com toda a linha de entrada (incluindo a nova linha). Você pode tentar isso com o comando cat : escreva alguns caracteres na linha e pressione Ctrl - D . Você verá os caracteres ecoados de volta para você e cat aguardando mais informações.

  • Tudo isso se aplica somente quando o terminal está no modo "cozido", em oposição ao modo "bruto", no qual o processamento de entrada de linha é minimizado. No modo raw, um caractere Ctrl-D é realmente entregue ao buffer de entrada.

por 09.10.2016 / 09:18
18

Os caracteres de controle ASCII possuem definições dos anos 60 (na verdade, precedem o que você pode considerar uma rede ). Nem todos esses caracteres de controle são usados da maneira como foram definidos para equipamentos de telecomunicações naquela época.

Em sistemas do tipo Unix, não há necessidade de um caractere EOF ; nenhum é usado. O sistema pode informar aos aplicativos quantos bytes estão em um arquivo:

  • Em alguns outros sistemas (vistos em VMS, DOS, Windows), um controle-Z pode atuar como um marcador de fim de arquivo porque em versões mais antigas o sistema não poderia dizer a algumas aplicações como muitos bytes estão no arquivo.

    No caso do VMS, a limitação era devido à maneira como o tempo de execução do C funcionava. Aplicativos em linguagem de montagem poderiam (e obtiveram) o tamanho correto do arquivo.

  • Sistemas Unix no shell utilizam convencionalmente o controle-D para dizer a um aplicativo que um fim de entrada (arquivo) foi atingido, mas o controle-D não é armazenado no arquivo .

Em C, EOF é feito propositadamente -1 para indicar que não é um caractere válido. E / S padrão retorna EOF quando uma condição de fim de arquivo é detectada - não é um caractere especial.

A propósito, os arquivos não precisam terminar com um caractere nova linha (feed de linha ASCII). Os editores de texto podem lidar com arquivos que são todos de texto para impressão, mas não possuem uma nova linha.

    
por 08.10.2016 / 19:23
7

EOF não é um personagem. É um estado que indica que não há mais caracteres para ler de um fluxo de arquivos. Quando você entra no comando EOF do terminal, você está sinalizando o sistema operacional para fechar o fluxo de entrada, não colocando um caractere especial.

    
por 08.10.2016 / 19:05

Tags