El concepto de EOF:
EOF (End-of-File) es un glifo que indica el final de un archivo en lenguaje C. Es una constante predefinida <stdio.h>
definida como una constante entera en los archivos de encabezado de biblioteca estándar.
uso:
EOF generalmente se define como -1, lo que indica el final del archivo. Se utiliza para indicar que se ha llegado al final del archivo o al final del flujo de entrada.
En las operaciones de entrada, EOF se usa a menudo para determinar si se ha llegado al final del archivo o al final del flujo de entrada para terminar la operación de lectura. Por ejemplo, cuando usa scanf
una función para la entrada, puede scanf
juzgar si se ha leído el final del archivo comparando el valor de retorno de la función con EOF.
int result = scanf("%d", &n);
if (result == EOF) {
// 文件结束或输入流结束
} else {
// 成功读取输入
}
En las operaciones con archivos, cuando se utilizan funciones como fgetc
, fgets
, fscanf
etc. para leer caracteres o cadenas de un archivo, estas funciones normalmente devuelven EOF cuando se lee el carácter de fin de archivo EOF.
int ch = fgetc(file);
if (ch == EOF) {
// 文件结束
} else {
// 成功读取字符
}
Cabe señalar que EOF no es un carácter real o un valor entero, sino un indicador especial que se usa para indicar el estado del final del archivo o el final del flujo de entrada.
El valor de EOF puede variar en diferentes sistemas operativos y compiladores, pero suele ser un número entero negativo (normalmente -1). Por lo tanto, comparar el valor de retorno de la función con EOF puede determinar el final del archivo multiplataforma.
información relacionada:
Para el contenido anterior, podemos comprender el valor de retorno de la función scanf para ayudarnos a comprender este EOF.
scanf
El valor de retorno de la función se usa para indicar el número de parámetros leídos con éxito, que se pueden usar para determinar si la entrada se ajusta al formato esperado.
scanf
El valor de retorno de la función tiene las siguientes situaciones:
- Si todos los parámetros del formato especificado se leen correctamente, se devuelve el número de parámetros leídos correctamente. Por ejemplo,
scanf("%d %f", &a, &b)
si se leyeron correctamente un entero y un flotante, el valor devuelto es 2. - Si los datos de entrada no se ajustan al formato especificado o no se pueden analizar correctamente en el tipo de parámetro especificado, el valor devuelto es 0. Esto indica que no se leyeron correctamente los parámetros.
- Si se encuentra el carácter de fin de archivo EOF y no se puede leer el siguiente parámetro, el valor devuelto es EOF (generalmente -1). Esto indica que se ha llegado al final del archivo o al final del flujo de entrada.
Al verificar scanf
el valor devuelto, puede tomar los métodos de procesamiento correspondientes de acuerdo con diferentes situaciones:
- Si el valor devuelto es igual al número esperado de parámetros, significa que todos los parámetros se leyeron correctamente.
- Si el valor devuelto es 0, es posible que el formato de entrada no coincida y se deba manejar el error de entrada.
- Si el valor devuelto es EOF, puede determinar si se alcanzó el final del archivo o el final del flujo de entrada.
Al verificar scanf
el valor devuelto, puede tomar los métodos de procesamiento correspondientes de acuerdo con diferentes situaciones. Si el valor devuelto es igual al número esperado de parámetros, significa que todos los parámetros se leyeron correctamente. Si el valor devuelto es 0, es posible que el formato de entrada no coincida y se deba manejar el error de entrada. Si el valor devuelto es EOF
, puede determinar si se ha alcanzado el final del archivo o el final del flujo de entrada.
En conjunto, al usar EOF
y verificar scanf
el valor de retorno de la función, podemos juzgar el estado del final del archivo y manejar el error de entrada en la operación de entrada para garantizar la corrección e integridad de la entrada.
úsalo mientras aprendes:
¿Bajo qué circunstancias usamos EOF? Aquí encontré un tema en Niuke.com:
Podemos ver que hay varios conjuntos de entradas en la descripción de entrada de esta pregunta, pero no nos dice la cantidad específica. En este momento, necesitamos usar EOF;
#include <stdio.h>
int main() {
int i;
while (scanf("%d", &i) != EOF) {
if (i % 2 == 0) {
printf("Even\n");
}
else {
printf("Odd\n");
}
}
return 0;
}
Explicación del código:
Este código también usa while
bucles y scanf
funciones para implementar la entrada de varias líneas y genera resultados basados en la paridad de los enteros de entrada.
En cada bucle, scanf
la función intenta leer un número entero y almacenarlo en una variable i
. La declaración de juicio condicional scanf("%d", &i) != EOF
verifica scanf
si el valor de retorno de la función es igual a EOF, si no es igual a EOF, significa que se ha leído un número entero con éxito.
Si el entero se lee con éxito, ingrese la declaración de juicio condicional if(i%2==0)
, juzgue la paridad del entero e imprima el resultado correspondiente.
análisis del problema:
Hay algunos problemas con la lógica de este código. En esta implementación, cuando no hay un carácter de nueva línea después de la entrada del último entero, es scanf
posible que la función no pueda leer EOF, lo que da como resultado un ciclo que no se puede terminar y puede ocurrir un ciclo infinito.
En esta cadena de códigos, ingresamos otros símbolos, por ejemplo, . ? ! o algo así, estará atrapado en un bucle sin fin
Solución:
En este código, ingresar otros símbolos (como ~, .) conducirá a un bucle infinito porque la scanf
función no puede analizar con éxito estos caracteres no numéricos y mantenerlos en el búfer de entrada.
Cuando scanf
la función no puede analizar correctamente la entrada, deja el contenido del búfer de entrada y devuelve 0, lo que indica que la lectura falló. Dado que el contenido del búfer de entrada %d
no coincide con los requisitos de formato, scanf
la función siempre devolverá 0, lo que provocará que el bucle no finalice y, por lo tanto, caiga en un bucle infinito.
Para evitar esto, puede verificar scanf
el valor de retorno después de leer para ver si la entrada se comparó y leyó correctamente.
Código modificado:
#include <stdio.h>
int main() {
int i;
int result;
while ((result = scanf("%d", &i)) != EOF) {
if (result == 1) {
if (i % 2 == 0) {
printf("Even\n");
} else {
printf("Odd\n");
}
} else {
printf("Invalid input\n");
break;
}
}
return 0;
}
En este código modificado, usamos result
variables para almacenar scanf
el valor de retorno de la función. Si result
es igual a 1, significa que se leyó correctamente un entero y se ejecuta la lógica correspondiente. Si result
no es igual a 1, significa que el formato de entrada no es el esperado, generamos "Entrada no válida" y usamos la break
instrucción para salir del bucle.
Después de esta modificación, cuando se ingresan otros caracteres no numéricos, el programa generará "Entrada no válida" y saltará del bucle sin caer en un bucle infinito.
Resumir:
Resumen: EOF (End-of-File) es un glifo en lenguaje C que indica el final del archivo y se utiliza para indicar que se ha llegado al final del archivo o al final del flujo de entrada. Por lo general, se define como -1, que se utiliza para juzgar si se ha leído el final del archivo. En las operaciones de entrada y archivo, EOF se puede utilizar para detectar el estado de fin de archivo.