feof()
La función feof() en PHP comprueba si se ha llegado al final de un archivo abierto. Esencial para desarrolladores web y administradores de servidores.
Introducción a la función feof() de PHP
La función feof() en PHP comprueba si se ha alcanzado el final del archivo (EOF) en un puntero de archivo abierto. A medida que lees un archivo con funciones como fgets() o fread(), PHP mantiene un cursor interno que avanza con cada lectura. feof() devuelve true una vez que una lectura ha intentado moverse más allá del último byte.
Esta página cubre la sintaxis de feof(), el detalle que más confunde a la gente (exactamente cuándo devuelve true), el patrón de bucle recomendado y un error común que conviene evitar.
Si eres nuevo en la apertura y lectura de archivos, comienza con Abrir y leer un archivo en PHP.
Sintaxis
La sintaxis de la función feof() es la siguiente:
La sintaxis PHP de feof()
bool feof ( resource $stream )$stream: el puntero de archivo (un recurso) a comprobar.- Devuelve:
bool—truesi el puntero de archivo está al final del archivo o si ha ocurrido un error,falseen caso contrario.
Parámetros
La función feof() acepta un parámetro obligatorio:
$stream: El puntero de archivo que deseas comprobar. Debe ser un recurso válido abierto confopen()(o una función de flujo similar) y aún abierto — pasar un puntero que ya ha sido cerrado confclose(), o cualquier cosa que no sea un recurso, genera una advertencia.
Cómo se detecta el EOF (el truco clave)
feof() no mira hacia adelante. Solo devuelve true después de que una función de lectura como fgets() o fread() haya intentado leer más allá del final del archivo:
- Comprobar
feof()inmediatamente después defopen(), antes de cualquier lectura, siempre devuelvefalse— incluso en un archivo vacío. - Un archivo que termina con una nueva línea se consume completamente solo cuando la lectura después de la última línea no devuelve nada; esa lectura final es la que cambia
feof()atrue.
Por esto, la forma robusta de leer un archivo es comprobar el valor de retorno de la función de lectura, no feof() por sí solo. En un flujo no buscable (un socket de red o una tubería) feof() también puede devolver true solo después de que se cierre la conexión, por lo que depender del resultado de la lectura es más seguro también en ese caso.
Ejemplos
Aquí hay algunos ejemplos de cómo usar la función feof():
Ejemplo 1: Comprobar si se ha llegado al final de un archivo tras una lectura
El siguiente ejemplo lee la primera línea del archivo y luego comprueba si se ha llegado al final:
Comprobar si se ha llegado al final de un archivo en PHP
<?php
$fileHandle = fopen("example.txt", "r");
// Read the first line
$firstLine = fgets($fileHandle);
// Now check if we've reached the end
if (feof($fileHandle)) {
echo "End of file reached";
} else {
echo "End of file not reached";
}
fclose($fileHandle);
?>Ejemplo 2: Patrón de bucle estándar (recomendado)
La forma más limpia y segura de leer un archivo línea por línea es hacer un bucle sobre el valor de retorno de fgets() — devuelve false al final del archivo, por lo que ni siquiera necesitas llamar a feof() explícitamente. Este patrón también evita la trampa del bucle infinito descrita a continuación:
Bucle de lectura estándar en PHP
<?php
$fileHandle = fopen("example.txt", "r");
if ($fileHandle === false) {
die("Error: Could not open file.");
}
while (($line = fgets($fileHandle)) !== false) {
echo $line;
}
fclose($fileHandle);
?>Esto imprime cada línea del archivo hasta que se llega al final.
Ejemplo 3: Una demostración autónoma y ejecutable
Este ejemplo crea un archivo temporal, escribe tres líneas y luego lo lee con feof() para que puedas ver exactamente cuándo el EOF cambia a true:
Demostración del comportamiento de feof()
<?php
$path = tempnam(sys_get_temp_dir(), "demo");
file_put_contents($path, "line 1\nline 2\nline 3\n");
$fh = fopen($path, "r");
var_dump(feof($fh)); // false — nothing read yet
while (!feof($fh)) {
$line = fgets($fh);
if ($line === false) {
break; // read failed / past EOF
}
echo "Read: " . trim($line) . "\n";
}
var_dump(feof($fh)); // true — last read passed EOF
fclose($fh);
unlink($path);
?>Salida esperada:
bool(false)
Read: line 1
Read: line 2
Read: line 3
bool(true)Error común: el bucle infinito
Llamar a fgets() sin comprobar su valor de retorno dentro de un bucle while (!feof($fh)) es arriesgado. Si se produce un error de lectura (o el flujo nunca reporta EOF), feof() nunca se vuelve true y el bucle gira indefinidamente. Siempre combina la comprobación de EOF con el resultado de la lectura — o, más sencillo, haz el bucle directamente sobre fgets() como en el Ejemplo 2.
Funciones relacionadas
fopen()— abre el archivo y obtiene el puntero quefeof()comprueba.fgets()— lee una línea a la vez.fread()— lee un número fijo de bytes.fclose()— cierra el puntero cuando has terminado.
Conclusión
La función feof() indica si una lectura ha pasado el final de un archivo abierto. La regla más importante es que solo se vuelve true después de un intento de lectura, por lo que los bucles de archivo más seguros comprueban el valor de retorno de fgets() o fread() directamente. Con ese patrón evitas tanto las salidas prematuras como los bucles infinitos.