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
while (!feof(f))procesa la última línea dos veces.- La solución es que el bucle dependa del resultado de la propia lectura.
ferrordespués distingue un error real del final.
Palabras clave y builtins usados aquí
FILENULLcharintreturnsizeofwhile
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.
Paso 3 de 4 en Abrir y leer; paso 3 de 12 en Archivos y E/S.