while tipos manejo funcion dev archivos archivo c eof

tipos - while( feof(archivo))



Fin del archivo(EOF) en C (3)

Actualmente estoy leyendo el libro C Programming Language de Ritchie & Kernighan. Y estoy bastante confundido sobre el uso de EOF en la función getchar() .

Primero, quiero saber por qué el valor de EOF es -1 y por qué el valor de getchar()!=EOF es 0. Perdónenme por mi pregunta, pero realmente no entiendo. Realmente lo intenté pero no puedo.

Luego traté de ejecutar el ejemplo en el libro que puede contar el número de caracteres usando el siguiente código, pero parece que nunca salgo del ciclo, incluso si presiono enter, entonces me pregunto cuándo llegaré al EOF.

main(){ long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld/n", nc); }

Luego, leí el mismo problema en Problema con EOF en C. La mayoría de las personas aconseja que, en lugar de utilizar EOF, utilice el terminador / n o el terminador nulo ''/ 0'', que tiene mucho sentido.

¿Significa que el ejemplo en el libro sirve para otro propósito?


EOF es -1 porque así es como está definido. El nombre lo proporcionan los encabezados de biblioteca estándar que #include . Lo hacen igual a -1 porque tiene que ser algo que no se puede confundir con una lectura de byte real de getchar() . getchar() informa los valores de bytes reales usando un número positivo (0 hasta 255 inclusive), por lo que -1 funciona bien para esto.

El operador != Significa "no igual". 0 significa falso, y cualquier otra cosa significa verdad. Entonces, lo que ocurre es que llamamos a la función getchar() y comparamos el resultado con -1 (EOF). Si el resultado no fue igual a EOF, entonces el resultado es verdadero, porque las cosas que no son iguales no son iguales. Si el resultado fue igual a EOF, el resultado es falso, porque las cosas que son iguales no son (no iguales).

La llamada a getchar() devuelve EOF cuando llega al "final del archivo". En lo que respecta a C, la ''entrada estándar'' (los datos que le está dando a su programa al escribir en la ventana de comandos) es como un archivo. Por supuesto, siempre puede escribir más, por lo que necesita una forma explícita de decir "He terminado". En sistemas Windows, esto es control-Z. En los sistemas Unix, esto es control-D.

El ejemplo en el libro no es "incorrecto". Depende de lo que realmente quieras hacer . Leer hasta EOF significa que lees todo, hasta que el usuario dice "He terminado", y luego ya no puedes leer más. Leer hasta ''/ n'' significa que lee una línea de entrada. Leer hasta ''/ 0'' es una mala idea si espera que el usuario escriba la entrada, porque es difícil o imposible producir este byte con un teclado en el símbolo del sistema :)


EOF indica "fin del archivo". Una nueva línea (que es lo que sucede cuando presiona enter) no es el final de un archivo , es el final de una línea , por lo que una nueva línea no termina este ciclo.

El código no está mal [*], simplemente no hace lo que parece esperar. Se lee hasta el final de la entrada, pero parece que quiere leer solo hasta el final de una línea.

El valor de EOF es -1 porque tiene que ser diferente de cualquier valor de retorno de getchar que sea un carácter real. Entonces getchar devuelve cualquier valor de carácter como un carácter sin signo, convertido a int, que por lo tanto no será negativo.

Si está escribiendo en la terminal y desea provocar un final de archivo, use CTRL-D (sistemas estilo unix) o CTRL-Z (Windows). Luego, después de que se haya leído toda la entrada, getchar() devolverá EOF , y por getchar() != EOF tanto getchar() != EOF será falso, y el ciclo terminará.

[*] bueno, tiene un comportamiento indefinido si la entrada es más que caracteres LONG_MAX debido al desbordamiento de enteros, pero probablemente podamos perdonar eso en un ejemplo simple.


Esas son muchas preguntas.

  1. Por qué EOF es -1: generalmente -1 en las llamadas al sistema POSIX se devuelve por error, así que supongo que la idea es "EOF es un tipo de error"

  2. cualquier operación booleana (incluyendo! =) devuelve 1 en caso de que sea VERDADERO, y 0 en caso de que sea FALSO, por lo que getchar() != EOF es 0 cuando es FALSO, lo que significa que getchar() devolvió EOF .

  3. para emular EOF al leer desde stdin presione Ctrl + D