typestar

La trampa de feof en C

feof avisa que una lectura ya falló; probarlo antes lee una línea de más.

#include <stdio.h>

/* Mal: feof solo es verdadero después de que una lectura falló. */
int overcounts(FILE *f) {
    char line[128];
    int n = 0;
    while (!feof(f)) {
        fgets(line, (int) sizeof line, f);
        n++;
    }
    return n;
}

/* Bien: el resultado de la lectura es la condición del bucle. */
int counts(FILE *f) {
    char line[128];
    int n = 0;
    while (fgets(line, (int) sizeof line, f) != NULL) {
        n++;
    }
    return ferror(f) ? -1 : n;
}

Cómo funciona

  1. while (!feof(f)) procesa la última línea dos veces.
  2. La solución es que el bucle dependa del resultado de la propia lectura.
  3. ferror después distingue un error real del final.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
22
Caracteres a escribir
417
Tokens
109
Ritmo de tres estrellas
95 tpm

Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 69 segundos.

Escribe este fragmento

Paso 3 de 4 en Abrir y leer; paso 3 de 12 en Archivos y E/S.

← Anterior Siguiente →