W3docs

rewind()

Aprende a usar rewind() en PHP para reiniciar el puntero de archivo al inicio, con sintaxis, ejemplos y errores comunes a evitar.

Introducción

Cuando lees un archivo en PHP, un puntero de archivo interno lleva el seguimiento de tu posición actual. Cada lectura avanza el puntero, de modo que una vez que llegas al final del archivo, las lecturas posteriores no devuelven nada. La función rewind() mueve ese puntero de vuelta al byte 0 — el principio absoluto — permitiéndote leer el mismo archivo de nuevo sin necesidad de cerrarlo y volver a abrirlo.

Esta página explica qué hace rewind(), su sintaxis y valor de retorno, cuándo usarla, los errores comunes y ejemplos ejecutables que puedes adaptar.

Qué es el puntero de archivo

Piensa en el puntero de archivo como un cursor dentro del archivo abierto. Funciones como fread(), fgets() y fgetcsv() leen desde ese cursor y luego lo avanzan en el número de bytes consumidos. Puedes inspeccionar el cursor con ftell() y moverlo a una posición arbitraria con fseek().

rewind($handle) es el atajo conveniente para "volver al inicio" — es equivalente a fseek($handle, 0).

Sintaxis

rewind(resource $handle): bool
  • $handle — un recurso de puntero de archivo que aún está abierto, típicamente devuelto por fopen(). Debe apuntar a un stream que pueda ser reposicionado.
  • Devuelve true en caso de éxito y false en caso de fallo.

Por qué y cuándo usarla

Usa rewind() siempre que necesites leer o procesar el mismo archivo abierto más de una vez en una sola ejecución del script:

  • Contar y luego procesar. Primera pasada para contar líneas o validar, segunda pasada para el trabajo real.
  • Releer después de escribir. Tras escribir en un archivo abierto en modo lectura/escritura ('w+', 'r+', 'a+'), rebobina antes de leer lo que escribiste.
  • Streams en memoria. Cuando construyes contenido en un stream php://memory o php://temp, rebobina antes de leerlo.

Si solo lees un archivo una vez, no necesitas rewind() en absoluto.

Ejemplos

Ejemplo 1: Leer el mismo archivo dos veces

Este ejemplo crea un archivo temporal, lo lee hasta el final, luego rebobina y lo lee de nuevo.

<?php

// Create a temporary file we can read and write.
$handle = tmpfile();
fwrite($handle, "line one\nline two\n");

// Move to the start so we can read what we just wrote.
rewind($handle);

echo "First read:\n";
echo fread($handle, 1024);

// The pointer is now at the end; reading again gives nothing.
echo "After first read, position: " . ftell($handle) . "\n";

// Rewind and read the whole file again.
rewind($handle);
echo "Second read:\n";
echo fread($handle, 1024);

fclose($handle);

Salida:

First read:
line one
line two
After first read, position: 18
Second read:
line one
line two

El primer fread() deja el puntero en el byte 18 (el final del archivo). Sin rewind(), una segunda lectura devolvería una cadena vacía. Después de rebobinar, el puntero vuelve a 0 y el contenido completo está disponible de nuevo.

Ejemplo 2: Escribir, rebobinar y luego releer

Cuando un stream se abre tanto para escritura como para lectura, rewind() permite verificar lo que escribiste.

<?php

// php://memory is an in-memory read/write stream.
$handle = fopen('php://memory', 'r+');

fwrite($handle, 'Hello, W3Docs!');

// Without rewind, the pointer sits after the written text,
// so reading now would return an empty string.
rewind($handle);

$content = stream_get_contents($handle);
echo $content; // Hello, W3Docs!

fclose($handle);

Salida:

Hello, W3Docs!

Ejemplo 3: Verificar siempre el valor de retorno

rewind() devuelve false cuando el stream no puede ser reposicionado (por ejemplo, un stream de red o pipe no buscable).

<?php

$handle = fopen('php://memory', 'r+');
fwrite($handle, 'data');

if (rewind($handle)) {
    echo "Pointer reset. Position: " . ftell($handle) . "\n";
} else {
    echo "This stream cannot be rewound.\n";
}

fclose($handle);

Salida:

Pointer reset. Position: 0

Errores comunes

  • El puntero ya está al final después de leer. Esta es la razón de ser de rewind(). Si una segunda lectura no devuelve nada, probablemente olvidaste rebobinar.
  • Modo append ('a' / 'a+'). Rebobinar mueve el puntero de lectura al inicio, pero en modo append cada fwrite() sigue añadiendo al final del archivo independientemente de la posición del puntero.
  • Streams no buscables. Los pipes, sockets y algunos streams HTTP no pueden ser rebobinados; rewind() devuelve false. Verifica el valor de retorno cuando la fuente podría no ser buscable.
  • Recursos cerrados. Llamar a rewind() en un recurso ya pasado a fclose() genera una advertencia. Rebobina antes de cerrar.

Funciones relacionadas

  • fseek() — mueve el puntero a cualquier desplazamiento de bytes (rewind() es fseek($handle, 0)).
  • ftell() — informa la posición actual del puntero.
  • fopen() — abre un archivo o stream y obtiene el recurso.
  • fread() / fgets() — lee desde la posición actual.
  • fclose() — cierra el recurso cuando hayas terminado.

Conclusión

rewind() reinicia el puntero interno de un archivo abierto al principio para que puedas releer o reprocesar los datos en la misma ejecución del script. Es un envoltorio delgado y conveniente alrededor de fseek($handle, 0). Recuerda verificar su valor de retorno para streams no buscables, ten en cuenta el comportamiento del modo append, y rebobina antes de cerrar el recurso.

Práctica

Práctica
¿Cuál es la función de 'rewind()' en PHP?
¿Cuál es la función de 'rewind()' en PHP?
Was this page helpful?