W3docs

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: booltrue si el puntero de archivo está al final del archivo o si ha ocurrido un error, false en caso contrario.

Parámetros

La función feof() acepta un parámetro obligatorio:

  1. $stream: El puntero de archivo que deseas comprobar. Debe ser un recurso válido abierto con fopen() (o una función de flujo similar) y aún abierto — pasar un puntero que ya ha sido cerrado con fclose(), 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 de fopen(), antes de cualquier lectura, siempre devuelve false — 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() a true.

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 que feof() 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.

Práctica

Práctica
¿Cuál es el propósito principal de la función 'feof()' en PHP?
¿Cuál es el propósito principal de la función 'feof()' en PHP?
Was this page helpful?