librerias - Detectando EOF en C
stdio.h download (6)
Desea verificar el resultado de scanf () para asegurarse de que haya una conversión exitosa; Si no hubo, entonces una de las tres cosas es verdad:
- scanf () se está atragantando con un carácter que no es válido para el especificador de conversión% f (es decir, algo que no es un dígito, punto, ''e'' o ''E'');
- scanf () ha detectado EOF;
- scanf () ha detectado un error al leer la entrada estándar.
Ejemplo:
int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
* Loop while moreData is true
*/
while (moreData)
{
errno = 0;
int itemsRead = scanf("%f", &input);
if (itemsRead == 1)
{
printf("Output: %f/n", input);
printf("Input no: ");
fflush(stdout);
}
else
{
if (feof(stdin))
{
printf("Hit EOF on stdin; exiting/n");
moreData = 0;
}
else if (ferror(stdin))
{
/**
* I *think* scanf() sets errno; if not, replace
* the line below with a regular printf() and
* a generic "read error" message.
*/
perror("error during read");
moreData = 0;
}
else
{
printf("Bad character stuck in input stream; clearing to end of line/n");
while (getchar() != ''/n'')
; /* empty loop */
printf("Input no: ");
fflush(stdout);
}
}
Estoy usando el siguiente código C para recibir información del usuario hasta que se produzca EOF, pero el problema es que este código no funciona, termina después de tomar la primera entrada ¿Alguien puede decirme cuál es el problema con este código? Gracias por adelantado.
float input;
printf("Input No: ");
scanf("%f", &input);
while(!EOF)
{
printf("Output: %f", input);
printf("Input No: ");
scanf("%f", &input);
}
Otro problema es que estás leyendo con scanf("%f", &input);
solamente. Si el usuario escribe algo que no se puede interpretar como un número de punto flotante en C, como "pi", la llamada a scanf()
no asignará nada a la input
, y no progresará desde allí. Esto significa que intentaría seguir leyendo "pi" y fallar.
Dado el cambio a while(!feof(stdin))
que recomiendan otros carteles, si escribiera "pi" habría un bucle infinito de impresión del valor anterior de input
e impresión del mensaje, pero el programa nunca lo haría. procesar cualquier entrada nueva.
scanf()
devuelve el número de asignaciones a las variables de entrada que realizó. Si no realizó ninguna asignación, eso significa que no encontró un número de punto flotante, y debería leer más entradas con algo como la char string[100];scanf("%99s", string);
. Esto eliminará la siguiente cadena de la secuencia de entrada (hasta 99 caracteres, de todos modos, el char
adicional es para el terminador nulo en la cadena).
Sabes, esto me está recordando todas las razones por las que odio scanf()
, y por qué utilizo fgets()
lugar y, a continuación, tal vez lo sscanf()
utilizando sscanf()
.
como punto de partida podría intentar reemplazar
while(!EOF)
con
while(!feof(stdin))
EOF
es solo una macro con un valor (generalmente -1). Tienes que probar algo contra EOF
, como el resultado de una getchar()
a getchar()
.
Una forma de probar el final de un flujo es con la función feof
.
if (feof(stdin))
Tenga en cuenta que el estado de ''fin de la secuencia'' solo se establecerá después de una lectura fallida.
En su ejemplo, probablemente debería verificar el valor de retorno de scanf y, si esto indica que no se leyó ningún campo, verifique el final del archivo.
EOF
es una constante en C. No está revisando el archivo real para EOF. Necesitas hacer algo como esto
while(!feof(stdin))
Aquí está la documentación para feof . También puede comprobar el valor de retorno de scanf . Devuelve el número de elementos convertidos con éxito, o EOF
si llega al final del archivo.
while(scanf("%d %d",a,b)!=EOF)
{
//do .....
}