Explicación detallada de EOF en lenguaje c

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 scanfuna función para la entrada, puede scanfjuzgar 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, fscanfetc. 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.

scanfEl 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.

scanfEl 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 scanfel 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 scanfel 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 EOFy verificar scanfel 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 whilebucles y scanffunciones para implementar la entrada de varias líneas y genera resultados basados ​​en la paridad de los enteros de entrada.

En cada bucle, scanfla función intenta leer un número entero y almacenarlo en una variable i. La declaración de juicio condicional scanf("%d", &i) != EOFverifica scanfsi 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 scanfposible 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 scanffunción no puede analizar con éxito estos caracteres no numéricos y mantenerlos en el búfer de entrada.

Cuando scanfla 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 %dno coincide con los requisitos de formato, scanfla 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 scanfel 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 resultvariables para almacenar scanfel valor de retorno de la función. Si resultes igual a 1, significa que se leyó correctamente un entero y se ejecuta la lógica correspondiente. Si resultno es igual a 1, significa que el formato de entrada no es el esperado, generamos "Entrada no válida" y usamos la breakinstrucció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.

Supongo que te gusta

Origin blog.csdn.net/m0_64857566/article/details/130609865
Recomendado
Clasificación