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 dafopen()(o una risorsa stream simile). Lo stream deve essere valido e ricercabile.- Restituisce
truein caso di successo efalsein 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://memoryophp://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()restituiscefalse. 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 successivafgets()/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.