W3docs

rewind()

Erfahren Sie, wie PHP's rewind() den Dateizeiger auf den Anfang zurücksetzt, damit Sie die Datei erneut lesen können. Syntax, Rückgabewert und Beispiele.

Einführung

Wenn Sie eine Datei in PHP öffnen, verfolgt das System einen Dateizeiger — eine interne Position, die angibt, wo der nächste Lese- oder Schreibvorgang stattfinden wird. Jedes Mal, wenn Sie mit fgets() oder fread() lesen, bewegt sich dieser Zeiger vorwärts. Die Funktion rewind() sendet den Zeiger zurück an den Anfang der Datei (Byte 0), sodass Sie sie erneut von Beginn an lesen können, ohne sie schließen und wieder öffnen zu müssen.

Dieses Kapitel erklärt, was rewind() tut, seine Syntax und seinen Rückgabewert sowie wann Sie es anstelle von fseek() verwenden würden.

Syntax

rewind(resource $stream): bool
  • $stream — ein von fopen() zurückgegebener Dateizeiger (oder eine ähnliche Stream-Ressource). Der Stream muss gültig und seek-fähig sein.
  • Gibt true bei Erfolg und false bei Fehler zurück.

Der Aufruf rewind($stream) ist äquivalent zu fseek($stream, 0): Beide verschieben den Zeiger an den Anfang der Datei. Verwenden Sie ftell() jederzeit, um die aktuelle Position des Zeigers zu lesen.

Hinweis: Bei Streams, die im Anhängemodus ('a' oder 'a+') geöffnet wurden, wird der Lesezeiger an den Anfang verschoben, aber Schreibvorgänge werden weiterhin an das Ende der Datei angehängt.

Beispiel: Eine Datei erneut von Anfang lesen

Nachdem Sie einen Teil einer Datei gelesen haben, ermöglicht rewind() Ihnen, wieder von oben zu beginnen:

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

Das erste fgets() liest eine Zeile und lässt den Zeiger irgendwo in der Datei, sodass ftell() einen Offset ungleich null meldet. Nach rewind() gibt ftell() den Wert 0 zurück, und der nächste Lesevorgang beginnt wieder beim ersten Byte.

Wann rewind() verwendet werden sollte

  • Zwei Durchläufe über dieselbe Datei. Zählen Sie zum Beispiel die Zeilen einer Datei und durchlaufen Sie sie dann erneut, um sie zu verarbeiten — ohne die Datei erneut zu öffnen.
  • Zurücksetzen nach dem Schreiben. Sie schreiben in einen temporären Stream, dann führen Sie rewind() aus und lesen zurück, was Sie gerade geschrieben haben.
  • Erneutes Lesen eines Streams, zu dem Sie nur ein Handle haben, wie php://memory oder php://temp.

Verwenden Sie stattdessen fseek(), wenn Sie zu einem beliebigen Offset springen müssen und nicht nur zum absoluten Anfang. Für Verzeichnis-Handles ist das entsprechende Zurücksetzen rewinddir().

Häufige Fallstricke

  • Nicht seek-fähige Streams. Einige Streams (Netzwerk-Sockets, bestimmte Pipes) können nicht zurückgespult werden; rewind() gibt false zurück. Überprüfen Sie immer den Rückgabewert, wenn der Stream möglicherweise nicht seek-fähig ist.
  • Verwechslung von Lese- und Schreibzeiger im Anhängemodus. Im Modus 'a'/'a+' erlaubt das Zurückspulen kein Überschreiben vom Anfang — neue Daten werden weiterhin am Ende angehängt.
  • Vergessen, dass Lesevorgänge den Zeiger weiterhin verschieben. rewind() setzt nur die Position zurück; das nächste fgets()/fread() wird ihn erneut vorwärts bewegen.

Fazit

rewind() setzt einen Dateizeiger auf den Anfang der Datei zurück, damit Sie sie erneut von Beginn an lesen können. Es gibt true bei Erfolg und false bei Fehler zurück und verhält sich wie fseek($stream, 0). Es lässt sich gut mit fopen(), fgets(), ftell() und fseek() kombinieren, wenn Sie mehr als einen Durchlauf über dieselbe Datei oder denselben Stream benötigen.

Übungen

Übung
Was macht die PHP-Funktion 'rewind()'?
Was macht die PHP-Funktion 'rewind()'?
Was this page helpful?