W3docs

rewind()

Scopri come rewind() in PHP riporta il puntatore di file all'inizio per rileggere il file. Sintassi, valore restituito, esempi e confronto con fseek().

Introduzione

Quando si apre un file in PHP, il sistema tiene traccia di un puntatore di file — una posizione interna che indica dove avverrà la successiva lettura o scrittura. Ogni volta che si legge con fgets() o fread(), il puntatore avanza. La funzione rewind() riporta il puntatore all'inizio assoluto del file (byte 0) in modo da poterlo rileggere dall'inizio senza chiuderlo e riaprirlo.

Questo capitolo spiega cosa fa rewind(), la sua sintassi e il valore restituito, e quando è preferibile usarla al posto di fseek().

Sintassi

rewind(resource $stream): bool
  • $stream — un puntatore a file restituito da fopen() (o una risorsa stream simile). Lo stream deve essere valido e ricercabile.
  • Restituisce true in caso di successo e false in caso di errore.

Chiamare rewind($stream) equivale a fseek($stream, 0): entrambi spostano il puntatore all'inizio del file. Usa ftell() in qualsiasi momento per leggere la posizione corrente del puntatore.

Nota: Negli stream aperti in modalità append ('a' o 'a+'), il puntatore di lettura viene spostato all'inizio, ma le scritture vengono comunque aggiunte alla fine del file.

Esempio: rileggere un file dall'inizio

Dopo aver letto una parte di un file, rewind() permette di ricominciare dall'inizio:

<?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);

La prima fgets() legge una riga e lascia il puntatore a metà del file, quindi ftell() riporta un offset non zero. Dopo rewind(), ftell() restituisce 0 e la lettura successiva riparte dal primo byte.

Quando usare rewind()

  • Due passaggi sullo stesso file. Ad esempio, contare le righe di un file e poi ciclare nuovamente per elaborarle — senza riaprire il file.
  • Reimpostare dopo la scrittura. Si scrive su uno stream temporaneo, poi si chiama rewind() e si rilegge ciò che è stato scritto.
  • Rileggere uno stream di cui si possiede solo un handle, come php://memory o php://temp.

Usa fseek() quando hai bisogno di spostarti a un offset arbitrario invece che all'inizio assoluto. Per gli handle di directory, il ripristino equivalente è rewinddir().

Errori comuni

  • Stream non ricercabili. Alcuni stream (socket di rete, certi pipe) non possono essere riavvolti; rewind() restituisce false. Controlla sempre il valore restituito se lo stream potrebbe non essere ricercabile.
  • Confondere i puntatori di lettura e scrittura in modalità append. In modalità 'a'/'a+', riavvolgere non permette di sovrascrivere dall'inizio — i nuovi dati vengono comunque scritti alla fine.
  • Dimenticare che le letture avanzano ancora il puntatore. rewind() reimposta solo la posizione; la successiva fgets()/fread() la sposterà di nuovo in avanti.

Conclusione

rewind() riporta il puntatore di file all'inizio del file in modo da poterlo rileggere dall'inizio. Restituisce true in caso di successo e false in caso di errore, e si comporta come fseek($stream, 0). Si abbina naturalmente a fopen(), fgets(), ftell() e fseek() quando è necessario effettuare più di un passaggio sullo stesso file o stream.

Esercitazione

Pratica
Cosa fa la funzione PHP 'rewind()'?
Cosa fa la funzione PHP 'rewind()'?
Was this page helpful?