W3docs

feof()

Die Funktion feof() in PHP prüft, ob das Ende einer Datei erreicht wurde – unverzichtbar für Entwickler beim Lesen von Dateien.

Einführung in die PHP-Funktion feof()

Die Funktion feof() in PHP prüft, ob das Ende der Datei (EOF) bei einem geöffneten Dateihandle erreicht wurde. Beim Lesen einer Datei mit Funktionen wie fgets() oder fread() verwaltet PHP intern einen Cursor, der mit jedem Lesevorgang weiterrückt. feof() gibt true zurück, sobald ein Leseversuch über das letzte Byte hinausgegangen ist.

Diese Seite behandelt die Syntax von feof(), die eine Besonderheit, über die die meisten stolpern (wann genau sie true zurückgibt), das empfohlene Schleifenmuster und einen häufigen Fehler, den man vermeiden sollte.

Wenn Sie noch keine Erfahrung mit dem Öffnen und Lesen von Dateien haben, beginnen Sie mit Eine Datei in PHP öffnen und lesen.

Syntax

Die Syntax der Funktion feof() lautet wie folgt:

Die PHP-Syntax von feof()

bool feof ( resource $stream )
  • $stream: der zu prüfende Dateizeiger (eine Ressource).
  • Rückgabewert: booltrue, wenn der Dateizeiger am Ende der Datei steht oder ein Fehler aufgetreten ist, andernfalls false.

Parameter

Die Funktion feof() erwartet einen erforderlichen Parameter:

  1. $stream: Der Dateizeiger, den Sie prüfen möchten. Er muss eine gültige Ressource sein, die mit fopen() (oder einer ähnlichen Stream-Funktion) geöffnet wurde und noch offen ist — das Übergeben eines bereits mit fclose() geschlossenen Zeigers oder eines Werts, der keine Ressource ist, erzeugt eine Warnung.

Wie EOF erkannt wird (die wichtige Besonderheit)

feof() liest nicht voraus. Es gibt true erst nach einem Lesevorgang zurück, bei dem eine Funktion wie fgets() oder fread() versucht hat, über das Ende der Datei hinaus zu lesen:

  • Der Aufruf von feof() direkt nach fopen(), vor einem Lesevorgang, gibt immer false zurück — auch bei einer leeren Datei.
  • Eine Datei, die mit einem Zeilenumbruch endet, ist erst dann vollständig gelesen, wenn der Lesevorgang nach der letzten Zeile nichts mehr zurückgibt; dieser letzte Lesevorgang setzt feof() auf true.

Aus diesem Grund ist es sicherer, den Rückgabewert der Lesefunktion zu prüfen und nicht allein feof(). Bei einem nicht suchbaren Stream (einem Netzwerk-Socket oder einer Pipe) kann feof() ebenfalls erst true zurückgeben, wenn die Verbindung geschlossen ist — daher ist das Prüfen des Leseergebnisses hier ebenfalls die zuverlässigere Methode.

Beispiele

Hier sind einige Beispiele zur Verwendung der Funktion feof():

Beispiel 1: Prüfen, ob das Ende einer Datei nach einem Lesevorgang erreicht wurde

Das folgende Beispiel liest die erste Zeile der Datei und prüft anschließend, ob das Ende erreicht wurde:

Prüfen, ob das Ende einer Datei in PHP erreicht wurde

<?php

$fileHandle = fopen("example.txt", "r");
// Read the first line
$firstLine = fgets($fileHandle);

// Now check if we've reached the end
if (feof($fileHandle)) {
  echo "End of file reached";
} else {
  echo "End of file not reached";
}
fclose($fileHandle);
?>

Beispiel 2: Standardmäßiges Schleifenmuster (empfohlen)

Der sauberste und sicherste Weg, eine Datei Zeile für Zeile zu lesen, besteht darin, die Schleife auf dem Rückgabewert von fgets() aufzubauen — diese Funktion gibt am Dateiende false zurück, sodass feof() nicht explizit aufgerufen werden muss. Dieses Muster vermeidet auch die weiter unten beschriebene Endlosschleife:

Standard-Leseschleife in PHP

<?php

$fileHandle = fopen("example.txt", "r");
if ($fileHandle === false) {
  die("Error: Could not open file.");
}

while (($line = fgets($fileHandle)) !== false) {
  echo $line;
}
fclose($fileHandle);
?>

Dieses Beispiel gibt jede Zeile der Datei aus, bis das Ende erreicht ist.

Beispiel 3: Ein eigenständiges, ausführbares Demo

Dieses Beispiel erstellt eine temporäre Datei, schreibt drei Zeilen und liest sie anschließend mit feof() zurück, damit Sie genau sehen können, wann EOF auf true wechselt:

Demonstration des feof()-Verhaltens

<?php

$path = tempnam(sys_get_temp_dir(), "demo");
file_put_contents($path, "line 1\nline 2\nline 3\n");

$fh = fopen($path, "r");
var_dump(feof($fh)); // false — nothing read yet

while (!feof($fh)) {
  $line = fgets($fh);
  if ($line === false) {
    break; // read failed / past EOF
  }
  echo "Read: " . trim($line) . "\n";
}

var_dump(feof($fh)); // true — last read passed EOF
fclose($fh);
unlink($path);
?>

Erwartete Ausgabe:

bool(false)
Read: line 1
Read: line 2
Read: line 3
bool(true)

Häufiger Fehler: die Endlosschleife

fgets() ohne Prüfung des Rückgabewerts innerhalb einer while (!feof($fh))-Schleife aufzurufen, ist riskant. Tritt ein Lesefehler auf (oder meldet der Stream niemals EOF), wird feof() nie true und die Schleife läuft endlos. Kombinieren Sie die EOF-Prüfung immer mit dem Leseergebnis — oder noch einfacher: Schleifen Sie direkt über fgets() wie in Beispiel 2.

Verwandte Funktionen

  • fopen() — öffnet die Datei und liefert den Zeiger, den feof() prüft.
  • fgets() — liest eine Zeile nach der anderen.
  • fread() — liest eine feste Anzahl von Bytes.
  • fclose() — schließt den Zeiger, wenn Sie fertig sind.

Fazit

Die Funktion feof() gibt an, ob ein Lesevorgang das Ende einer geöffneten Datei überschritten hat. Die wichtigste Regel lautet, dass sie erst nach einem Leseversuch true wird. Daher ist es am sichersten, in Dateischleifen den Rückgabewert von fgets() oder fread() direkt zu prüfen. Mit diesem Muster vermeiden Sie sowohl vorzeitige Abbrüche als auch Endlosschleifen.

Übungen

Übung
Was ist der Hauptzweck der Funktion 'feof()' in PHP?
Was ist der Hauptzweck der Funktion 'feof()' in PHP?
Was this page helpful?