rewind()
Aprende cómo rewind() de PHP reinicia el puntero de archivo al inicio para releerlo. Cubre sintaxis, valor de retorno, ejemplos y fseek() vs rewind().
Introducción
Cuando abres un archivo en PHP, el sistema mantiene un seguimiento de un puntero de archivo — una posición interna que marca dónde ocurrirá la próxima lectura o escritura. Cada vez que lees con fgets() o fread(), ese puntero avanza. La función rewind() envía el puntero de vuelta al principio del archivo (byte 0) para que puedas leerlo nuevamente desde el inicio sin cerrar y volver a abrir el archivo.
Este capítulo explica qué hace rewind(), su sintaxis y valor de retorno, y cuándo deberías usarla en lugar de fseek().
Sintaxis
rewind(resource $stream): bool$stream— un puntero de archivo devuelto porfopen()(o un recurso de flujo similar). El flujo debe ser válido y permitir búsqueda.- Devuelve
trueen caso de éxito yfalseen caso de fallo.
Llamar a rewind($stream) es equivalente a fseek($stream, 0): ambos mueven el puntero al inicio del archivo. Usa ftell() en cualquier momento para leer la posición actual del puntero.
Nota: En flujos abiertos en modo de anexo (
'a'o'a+'), el puntero de lectura se mueve al principio, pero las escrituras siguen añadiéndose al final del archivo.
Ejemplo: releer un archivo desde el inicio
Después de leer parte de un archivo, rewind() te permite empezar de nuevo desde el principio:
<?php
$handle = fopen('notes.txt', 'r');
// Read the first line — this advances the pointer
echo fgets($handle); // e.g. "First line"
echo 'Pointer is at: ' . ftell($handle); // a non-zero byte offset
// Send the pointer back to the beginning
rewind($handle);
echo 'After rewind: ' . ftell($handle); // 0
// Re-read the same first line
echo fgets($handle); // "First line" again
fclose($handle);El primer fgets() lee una línea y deja el puntero a mitad del archivo, por lo que ftell() reporta un desplazamiento distinto de cero. Después de rewind(), ftell() devuelve 0, y la próxima lectura comienza nuevamente desde el primer byte.
Cuándo usar rewind()
- Dos pasadas sobre el mismo archivo. Por ejemplo, contar las líneas de un archivo y luego recorrerlo de nuevo para procesarlas — sin volver a abrirlo.
- Reiniciar tras una escritura. Escribes en un flujo temporal, luego haces
rewind()y lees lo que acabas de escribir. - Releer un flujo del que solo tienes un identificador, como
php://memoryophp://temp.
Recurre a fseek() cuando necesites saltar a un desplazamiento arbitrario en lugar del principio del archivo. Para identificadores de directorio, el reinicio equivalente es rewinddir().
Errores comunes
- Flujos no buscables. Algunos flujos (sockets de red, ciertos pipes) no pueden rebobinarse;
rewind()devuelvefalse. Comprueba siempre el valor de retorno si el flujo puede no ser buscable. - Confundir los punteros de lectura y escritura en modo de anexo. En el modo
'a'/'a+', rebobinar no permite sobrescribir desde el inicio — los nuevos datos siguen yendo al final. - Olvidar que las lecturas avanzan el puntero.
rewind()solo reinicia la posición; el siguientefgets()/fread()lo moverá hacia adelante de nuevo.
Conclusión
rewind() reinicia un puntero de archivo al inicio del archivo para que puedas releerlo desde el principio. Devuelve true en caso de éxito y false en caso de fallo, y se comporta como fseek($stream, 0). Funciona de forma natural junto con fopen(), fgets(), ftell() y fseek() cuando necesitas hacer más de una pasada sobre el mismo archivo o flujo.