una - lenguaje c feof
¿Representar a EOF en código C? (10)
Creo que puede variar de un sistema a otro, pero una forma de verificar sería simplemente usar printf
#include <stdio.h>
int main(void)
{
printf("%d", EOF);
return 0;
}
Hice esto en Windows y se imprimió -1
en la consola. Espero que esto ayude.
El carácter de nueva línea está representado por "/n"
en el código C. ¿Hay un equivalente para el carácter de final de archivo (EOF)?
EOF no es un personaje (en la mayoría de los sistemas operativos modernos). Es simplemente una condición que se aplica a una secuencia de archivos cuando se llega al final de la secuencia. La confusión surge porque un usuario puede indicar EOF para la entrada de la consola escribiendo un carácter especial (por ejemplo, Control-D en Unix, Linux, etc. ), pero el programa en ejecución no ve este carácter, sino que lo capta el sistema operativo que a su vez señala EOF al proceso.
Nota: en algunos sistemas operativos muy antiguos, EOF era un personaje, por ejemplo, Control-Z en CP / M, pero esto era un truco brutal para evitar la sobrecarga de mantener la longitud real de los archivos en los directorios del sistema de archivos.
El carácter EOF reconocido por el intérprete de comandos en Windows (y MSDOS, y CP / M) es 0x1a (decimal 26, también conocido como Ctrl + Z aka SUB)
Todavía se puede usar hoy, por ejemplo, para marcar el final de un encabezado legible para el usuario en un archivo binario: si el archivo comienza con "alguna descripción / x1a", el usuario puede volcar el contenido del archivo en la consola con el comando TIPO y el volcado se detendrá en el carácter EOF, es decir, imprime alguna descripción y se detiene, en lugar de continuar con la basura que sigue.
El valor de EOF no se puede confundir con ningún personaje real.
Si a= getchar()
, entonces debemos declarar lo suficientemente grande como para contener cualquier valor que getchar()
. No podemos usar char
ya que debe ser lo suficientemente grande como para contener EOF además de los personajes.
Esto es dependiente del sistema pero a menudo -1. Ver here
Existe la constante EOF
de tipo int, que se encuentra en stdio.h. No hay un literal de caracteres equivalente especificado por ningún estándar.
He leído todos los comentarios. Es interesante notar lo que sucede cuando imprimes esto:
printf("/nInteger = %d/n", EOF); //OUTPUT = -1
printf("Decimal = %d/n", EOF); //OUTPUT = -1
printf("Octal = %o/n", EOF); //OUTPUT = 37777777777
printf("Hexadecimal = %x/n", EOF); //OUTPUT = ffffffff
printf("Double and float = %f/n", EOF); //OUTPUT = 0.000000
printf("Long double = %Lf/n", EOF); //OUTPUT = 0.000000
printf("Character = %c/n", EOF); //OUTPUT = nothing
Como podemos ver aquí, EOF NO es un personaje (lo que sea).
La respuesta es NO, pero ...
Puede confundirse debido al comportamiento de fgets()
Desde http://www.cplusplus.com/reference/cstdio/fgets/ :
Lee los caracteres de la secuencia y los almacena como una cadena en C hasta que se hayan leído los caracteres (num-1) o se alcance una nueva línea o el final del archivo , lo que ocurra primero.
No. EOF no es un carácter, sino un estado del identificador de archivo.
Si bien hay caracteres de control en el conjunto de caracteres ASCII que representan el final de los datos, estos no se utilizan para señalar el final de los archivos en general. Por ejemplo EOT (^ D) que en algunos casos casi señala lo mismo.
Cuando la biblioteca C estándar usa un entero con signo para devolver caracteres y usa -1 para el final del archivo, esto es en realidad solo la señal para indicar que ocurrió un error. No tengo el estándar C disponible, pero para citar SUSv3:
Si se establece el indicador de fin de archivo para el flujo, o si el flujo está al final del archivo, se establecerá el indicador de fin del archivo para el flujo y fgetc () devolverá EOF. Si se produce un error de lectura, se establecerá el indicador de error para la transmisión, fgetc () devolverá EOF y establecerá errno para indicar el error.
EOF
no es un personaje. No puede ser: un archivo (binario) puede contener cualquier carácter. Supongamos que tiene un archivo con bytes cada vez mayores, que va de 0 1 2 3 ... 255 y una vez más de 0 1 ... 255, para un total de 512 bytes. Cualquiera de esos 256 bytes posibles que usted considere EOF
, el archivo será cortado.
Es por eso que getchar()
et al. devuelve un int
. El rango de valores de retorno posibles son aquellos que puede tener un char
, más un valor int
genuino EOF
(definido en stdio.h
). Esa es la razón por la que convertir el valor de retorno en un char
antes de verificar EOF
no funcionará.
Tenga en cuenta que algunos protocolos tienen "EOF" "caracteres". ASCII tiene "Fin de texto", "Fin de transmisión", "Fin de bloque de transmisión" y "Fin de medio". Otras respuestas han mencionado viejos sistemas operativos. Yo mismo ingresé ^ D en Linux y ^ Z en las consolas de Windows para dejar de dar entrada a los programas. (Pero los archivos que se leen a través de tuberías pueden tener caracteres ^ D y ^ Z en cualquier lugar y solo indican EOF cuando se quedan sin bytes). Las cadenas C terminan con el carácter ''/0''
, pero eso también significa que no pueden contener el carácter ''/0''
. Es por eso que todas las funciones de datos no de cadena C funcionan con una matriz char
(para contener los datos) y size_t
(para saber dónde terminan los datos).
Edición: El estándar C99 §7.19.1.3 establece:
Las macros son [...]
EOF
que se expande a una expresión constante de tipo entero, con el tipoint
y un valor negativo, que son devueltas por varias funciones para indicar el final del archivo , es decir, no más entradas de un flujo;