Acabei de ler as respostas para "Removendo um caractere de nova linha no final de um arquivo" e todos disseram para excluir o último caractere. Minha pergunta é: o personagem eof não é o último?
Acabei de ler as respostas para "Removendo um caractere de nova linha no final de um arquivo" e todos disseram para excluir o último caractere. Minha pergunta é: o personagem eof não é o último?
Respostas:
Um arquivo não termina com um caractere Fim do arquivo, como as respostas anteriores afirmam corretamente. Mas acho que as respostas e comentários contêm algumas imprecisões que merecem destaque:
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), Bloco do fim da transmissão (23), Fim do meio (25). O Separador de arquivos (28) talvez se aproxime mais de um caractere EOF. O código 26 é "Substituto", não EOF.
Ctrl- Destá associado apenas à entrada do terminal. Por exemplo, o comando
cat filea fileb filec > outfilenão envolve Ctrl- D. A propósito, você pode alterar o caractere EOF do terminal para algo diferente de Ctrl- Dusando o sttycomando
A rigor, Ctrl- D(ou o que você alterou) não é um código de chave EOF. O que ele faz é fazer com que a readchamada do sistema retorne com a entrada disponível, assim como pressionar return faz com que a chamada de sistema de leitura retorne uma linha de caracteres para o chamador. Por convenção, um valor de retorno zero da chamada do sistema de leitura (ou seja, zero caracteres lidos) sinaliza uma condição de final de arquivo. No entanto, o arquivo de entrada não é fechado automaticamente e, se a entrada vier do terminal, não é colocada no estado "final do arquivo". Você pode escrever um programa que continue lendo o terminal mesmo após um "final de arquivo" e a chamada de leitura poderá retornar diferente de zero para a próxima linha de entrada.
A analogia entre os caracteres eof e eol pode ser vista se Ctrl- Dfor pressionado quando alguma entrada já tiver sido escrita na linha. Por exemplo, se você escrever "abc" e pressionar Ctrl- Da chamada de leitura retornará, desta vez com um valor de retorno 3 e com "abc" armazenado no buffer passado como argumento. Como a leitura não retorna 0, isso não é interpretado como uma condição EOF pela convenção acima. Da mesma forma, pressionar retorno para faz com que a chamada de leitura retorne com toda a linha de entrada (incluindo nova linha). Você pode tentar isso com o catcomando: escreva alguns caracteres na linha e pressione Ctrl- D. Você verá os caracteres ecoando de volta para você e cataguardando mais informações.
Tudo acima 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 bruto, um caractere Ctrl-D é realmente entregue ao buffer de entrada.
Os caracteres de controle ASCII têm definições da década de 1960 (na verdade, precedendo o que você pode considerar uma rede ). Nem todos esses caracteres de controle são usados da maneira que foram definidos para equipamentos de telecomunicações naquela época.
Em sistemas tipo Unix, não há necessidade de um EOFpersonagem; nenhum é usado. O sistema pode dizer aos aplicativos quantos bytes há em um arquivo:
Em alguns outros sistemas (vistos no 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 podia dizer a alguns aplicativos quantos bytes há no arquivo.
No caso do VMS, a limitação ocorreu devido à maneira como o tempo de execução C funcionava. Os aplicativos em linguagem assembly poderiam (e conseguiram) obter o tamanho correto do arquivo.
Os sistemas Unix no shell usam convencionalmente control-D para informar a um aplicativo que um final de entrada (arquivo) foi atingido, mas o control-D não é armazenado no arquivo.
Em C, EOFé propositadamente feito -1para indicar que não é um caractere válido. A E / S padrão retorna EOFquando 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 de nova linha (alimentação de linha ASCII). Os editores de texto podem lidar com arquivos que são todos textos imprimíveis, mas não possuem uma nova linha final.
busyboxo vietc).
EOF não é um personagem. É um estado que indica que não há mais caracteres para ler de um fluxo de arquivos. Ao inserir o comando EOF no terminal, você está sinalizando ao sistema operacional para fechar o fluxo de entrada, sem colocar um caractere especial.
bashcolocar as mãos na entrada, ela é massageada pelo driver TTY. Este driver intercepta Ctrl-D e envia um EOF para bash (Onde EOF não é um personagem, mas um estatuto especial de arquivo)