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 comandostty
. -
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ê ecat
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.