O que é EOF na linguagem de programação C?

Como você consegue ver a última impressão? Em outras palavras, o que colocar em EOF? Eu verifiquei as definições e ele diz que o EOF é -1.

E se você digitar Ctrl-D, não verá nada.

#include  int main() { int c; while((c = getchar() != EOF)) { printf("%d\n", c); } printf("%d - at EOF\n", c); } 

Nos sistemas Linux e OS X, o caractere a ser inserido para causar um EOF é CtrlD . Para o Windows, é CtrlZ .

Dependendo do sistema operacional, esse caractere só funcionará se for o primeiro caractere em uma linha, ou seja, o primeiro caractere após um Enter . Como a input do console geralmente é orientada à linha, o sistema também pode não reconhecer o caractere EOF até que você o tenha seguido com Enter .

E sim, se esse caractere for reconhecido como um EOF, seu programa nunca verá o caractere real. Em vez disso, um programa em C receberá um -1 de getchar() .

Você deve mudar seus parênteses para

 while((c = getchar()) != EOF) 

Porque o operador “=” tem uma precedência menor que o operador “! =”. Então você obterá os resultados esperados. Sua expressão é igual a

 while (c = (getchar()!= EOF)) 

Você está recebendo os dois 1s como saída, porque você está fazendo a comparação “c! = EOF”. Isso sempre se tornará um para o personagem que você digitou e, em seguida, o “\ n” que segue, atingindo o retorno. Exceto pela última comparação em que c realmente é EOF, você terá um 0.

EDITAR sobre EOF: EOF é tipicamente -1, mas isso não é garantido pelo padrão. O padrão define apenas o EOF na seção 7.19.1:

EOF que se expande para uma expressão constante inteira, com o tipo int e um valor negativo, que é retornado por várias funções para indicar o fim do arquivo, ou seja, não há mais input de um stream;

É razoável supor que EOF seja igual a -1, mas ao usar EOF você não deve testar o valor específico, mas usar a macro.

O valor de EOF é um inteiro negativo para diferenciá-lo dos valores “char” que estão no intervalo de 0 a 255. Ele é tipicamente -1, mas pode ser qualquer outro número negativo … de acordo com as especificações POSIX, então você não deve assumir que é -1.

O caractere ^ D é o que você digita em um stream de console no UNIX / Linux para informar que finaliza logicamente um stream de input. Mas em outros contextos (como quando você está lendo de um arquivo) é apenas outro caractere de dados. De qualquer maneira, o caractere ^ D (significando o final da input) nunca chega ao código do aplicativo.

Como diz o @Bastien, o EOF também é retornado se getchar() falhar. Estritamente falando, você deve chamar ferror ou feof para ver se o EOF representa um erro ou um fim de stream. Mas na maioria dos casos, seu aplicativo fará a mesma coisa nos dois casos.

EOF significa fim do arquivo. É um sinal de que o final de um arquivo é atingido e que não haverá mais dados.

Editar:

Eu estou corrigido. Neste caso, não é um fim de arquivo. Como mencionado, ele é passado quando CTRL + d (linux) ou CTRL + z (windows) é passado.

Alguns erros de digitação:

 while((c = getchar())!= EOF) 

no lugar de:

 while((c = getchar() != EOF)) 

Também getchar () trata uma chave de retorno como uma input válida, então você também precisa armazená-la em buffer.EOF é um marcador para indicar o final da input. Geralmente é um int com todos os bits definidos.

 #include  int main() { int c; while((c = getchar())!= EOF) { if( getchar() == EOF ) break; printf(" %d\n", c); } printf("%d %u %x- at EOF\n", c , c, c); } 

impressões:

  49
 50
 -1 4294967295 ffffffff- at EOF 

para input:

 1
 2
 

A input de um terminal nunca é realmente “finalizada” (a menos que o dispositivo seja desconectado), mas é útil inserir mais de um “arquivo” em um terminal, portanto, uma sequência de teclas é reservada para indicar o final da input. No UNIX, a tradução do pressionamento de tecla para EOF é executada pelo driver do terminal, portanto, um programa não precisa distinguir os terminais dos outros arquivos de input. Por padrão, o driver converte um caractere Control-D no início de uma linha em um indicador de fim de arquivo. Para inserir um caractere Control-D (ASCII 04) real no stream de input, o usuário o precede com um caractere de comando “quote” (geralmente Control-V). O AmigaDOS é semelhante, mas usa Control- \ em vez de Control-D.

No DOS e Windows da Microsoft (e no CP / M e muitos sistemas operacionais DEC), a leitura do terminal nunca produzirá um EOF. Em vez disso, os programas reconhecem que a fonte é um terminal (ou outro “dispositivo de caractere”) e interpretam um determinado caractere reservado ou sequência como um indicador de fim de arquivo; mais comumente é um código ASCII Control-Z, 26. Alguns programas do MS-DOS, incluindo partes do shell do Microsoft MS-DOS (COMMAND.COM) e programas utilitários do sistema operacional (como o EDLIN), tratam um Control-Z. em um arquivo de texto como marcar o final de dados significativos e / ou append um Control-Z ao final ao gravar um arquivo de texto. Isso foi feito por duas razões:

  1. Retrocompatibilidade com CP / M. O sistema de arquivos CP / M registrava apenas os comprimentos de arquivos em múltiplos de “registros” de 128 bytes, portanto, por convenção, um caractere Control-Z era usado para marcar o final de dados significativos se terminasse no meio de um registro. O sistema de arquivos do MS-DOS sempre registrou o comprimento exato de bytes dos arquivos, portanto, isso nunca foi necessário no MS-DOS.

  2. Ele permite que os programas usem o mesmo código para ler inputs de um terminal e de um arquivo de texto.

 #include  int main() { int c; while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces printf("%d\n", c); } printf("%d - at EOF\n", c); } 

Eu acho que este é o caminho certo para verificar o valor de EOF. E eu verifiquei a saída.

Para INPUT: abc e Enter, obtive OUTPUT: 97 98 99 10. (os valores ASCII)

Para INPUT Ctrl-D, obtive OUTPUT: -1 – em EOF. Então eu acho que -1 é o valor para EOF.

Tente outras inputs em vez de Ctrl-D, como Ctrl-Z. Eu acho que isso varia de compilador para compilador.

 #include  int main() { int c; while((c = getchar()) != EOF) { putchar(c); } printf("%d at EOF\n", c); } 

modificou o código acima para dar mais clareza no EOF, pressione Ctrl + d e putchar é usado para imprimir o caractere de evitar o uso de printf dentro do loop while.

 int c; while((c = getchar())!= 10) { if( getchar() == EOF ) break; printf(" %d\n", c); }