W3docs

ftell()

Die PHP-Funktion ftell() gibt die aktuelle Position des Dateizeigers zurück. Erfahren Sie Syntax, Beispiele und häufige Fallstricke.

Was ist die ftell()-Funktion?

Die ftell()-Funktion ist eine eingebaute PHP-Funktion, die die aktuelle Position des Dateizeigers zurückgibt — den Byte-Offset, gezählt vom Anfang der Datei, an dem der nächste Lese- oder Schreibvorgang stattfinden wird. Jedes geöffnete Datei-Handle besitzt einen internen Cursor; fread(), fwrite() und fgets() rücken ihn vor, während fseek() und rewind() ihn explizit verschieben. ftell() meldet lediglich, wo sich dieser Cursor aktuell befindet, ohne ihn zu verändern.

Die Kenntnis des Offsets ist nützlich, wenn Sie festhalten möchten, an welcher Stelle einer Datei Sie sich befinden (um später mit fseek() weitermachen zu können), wenn Sie messen wollen, wie viele Bytes Sie bisher verarbeitet haben, oder wenn Sie das Ende eines Datensatzes in einer Datei mit fester Breite oder einer Binärdatei erkennen müssen.

Diese Seite behandelt die Syntax, ein ausführbares Beispiel, den Rückgabewert von ftell(), häufige Fallstricke (Anhängemodus, Streams) und das Verhältnis zu anderen Dateizeiger-Funktionen.

Syntax

ftell(resource $stream): int|false

$stream muss ein Dateihandle sein, das von fopen() zurückgegeben wird (oder von einer Funktion wie fsockopen()). Die Funktion gibt die Position als ganzzahligen Byte-Offset zurück oder false bei einem Fehler — zum Beispiel, wenn der Stream nicht seekbar ist. Da 0 (der Anfang der Datei) ein gültiger, „falsy" Wert ist, sollten Sie den Rückgabewert immer mit === prüfen:

$pos = ftell($file);
if ($pos === false) {
    // could not determine the position
}

Verwendung der ftell()-Funktion

Der typische Ablauf ist:

  1. Öffnen Sie die Datei mit fopen() im benötigten Modus.
  2. Lesen Sie aus der Datei oder schreiben Sie in sie, damit der Zeiger sich bewegt.
  3. Rufen Sie ftell() mit dem Dateihandle auf, um dessen Position zu lesen.
  4. Verwenden Sie diesen Offset — speichern Sie ihn beispielsweise oder übergeben Sie ihn an fseek().
  5. Schließen Sie die Datei mit fclose().

Das folgende Beispiel ist vollständig eigenständig: Es schreibt zuerst eine temporäre Datei, sodass Sie es ohne vorherige Datenvorbereitung ausführen können.

<?php

// Create a temporary file with known contents.
$filename = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($filename, 'Hello, World! This is a test.');

$file = fopen($filename, 'r');

echo "Start position: " . ftell($file) . "\n";   // 0

fread($file, 5);                                  // read "Hello"
echo "After reading 5 bytes: " . ftell($file) . "\n";  // 5

fread($file, 5);                                  // read ", Wor"
echo "After reading 5 more: " . ftell($file) . "\n";   // 10

rewind($file);                                    // jump back to the start
echo "After rewind: " . ftell($file) . "\n";      // 0

fseek($file, 7);                                  // jump to byte 7
echo "After fseek to 7: " . ftell($file) . "\n";  // 7
echo "Next 5 bytes: " . fread($file, 5) . "\n";   // "World"

fclose($file);
unlink($filename);

Ausgabe:

Start position: 0
After reading 5 bytes: 5
After reading 5 more: 10
After rewind: 0
After fseek to 7: 7
Next 5 bytes: World

Jedes fread() rückt den Zeiger um die tatsächlich gelesenen Bytes vor, sodass ftell() von 0 auf 5 und dann auf 10 anwächst. rewind() setzt ihn auf 0 zurück, und fseek($file, 7) verschiebt ihn direkt auf Byte 7, wo das Wort World beginnt.

Anhängemodus: Ein häufiger Fallstrick

Wenn eine Datei im Anhängemodus ('a' oder 'a+') geöffnet wird, gehen alle Schreibvorgänge ans Ende der Datei, unabhängig davon, wo sich der Zeiger befindet. ftell() kann direkt nach dem Öffnen 0 melden, obwohl Schreibvorgänge ans Ende gehen — der Rückgabewert beschreibt im Anhängemodus nicht zuverlässig, wo der nächste Schreibvorgang stattfindet. Wenn Sie präzise Positionen benötigen, öffnen Sie die Datei mit 'r+', 'w+' oder 'c+' und setzen Sie den Zeiger explizit mit fseek().

Ebenso können nicht-seekbare Streams (wie manche Netzwerk- oder Pipe-Streams) keine sinnvolle Position melden, und ftell() gibt für diese false zurück.

Verwandte Funktionen

ftell() arbeitet selten allein. Es ist Teil einer kleinen Familie von Dateizeiger-Funktionen:

  • fopen() — öffnet eine Datei und liefert das Handle, dessen Position ftell() ausliest.
  • fread() — liest Bytes und rückt den Zeiger vor.
  • fwrite() — schreibt Bytes und rückt den Zeiger vor.
  • fseek() — verschiebt den Zeiger auf eine absolute oder relative Position; zusammen mit ftell() können Offsets gespeichert und wiederhergestellt werden.
  • rewind() — setzt den Zeiger auf den Anfang zurück (entspricht fseek($file, 0)).
  • fclose() — schließt die Datei, wenn Sie fertig sind.

Für einen umfassenderen Überblick siehe PHP File Handling.

Fazit

Die ftell()-Funktion meldet den aktuellen Byte-Offset eines Dateizeigers, ohne ihn zu verschieben, was sie zum natürlichen Begleiter von fseek() und rewind() beim Navigieren in Dateien macht. Denken Sie daran, das Ergebnis mit === false zu vergleichen (da 0 ein gültiger Offset ist), und beachten Sie, dass der Anhängemodus und nicht-seekbare Streams keine zuverlässigen Positionen zurückgeben.

Übung

Übung
Was macht die ftell()-Funktion in PHP?
Was macht die ftell()-Funktion in PHP?
Was this page helpful?