W3docs

fgets()

Die Funktion fgets() liest in PHP eine einzelne Zeile aus einer Datei und gibt sie als string zurück.

Die Funktion fgets() liest jeweils eine Zeile aus einem geöffneten Datei-Handle. Sie ist die Standardmethode, um Textdateien in PHP zu verarbeiten, ohne die gesamte Datei in den Speicher zu laden — was bei großen Dateien wichtig ist, bei denen ein komplettes Einlesen auf einmal (mit file_get_contents() oder fread()) aufwändig oder unmöglich wäre.

Diese Seite behandelt die Syntax, den Rückgabewert von fgets(), die korrekte Leseschleife, häufige Stolperfallen und die Beziehung zu anderen Dateilese-Funktionen.

Was ist die Funktion fgets()?

fgets() liest ab der aktuellen Position eines geöffneten Datei-Handles bis einschließlich des nächsten Zeilenumbruchzeichens (\n) und gibt diesen Text als string zurück. Anschließend rückt der Datei-Zeiger vor, sodass der nächste Aufruf die nächste Zeile liest.

Die Funktion ist nicht auf Dateien auf der Festplatte beschränkt: Jeder mit fopen() geöffnete Stream funktioniert, einschließlich php://stdin zum Lesen von Tastatureingaben und Remote-URLs.

Syntax

fgets(resource $stream, ?int $length = null): string|false
  • $stream — ein von fopen() (oder einer anderen Stream-Funktion) zurückgegebener Datei-Zeiger. Er muss noch geöffnet sein.
  • $length (optional) — liest höchstens $length - 1 Bytes. Das Lesen endet, wenn ein Zeilenumbruch erreicht wird, das Dateiende erreicht wird oder $length - 1 Bytes gelesen wurden — je nachdem, was zuerst eintritt. Weglassen, um die gesamte Zeile unabhängig von ihrer Länge zu lesen.

Was fgets() zurückgibt

SituationRückgabewert
Eine Zeile wurde gelesenDie Zeile als string, mit dem abschließenden \n
Bereits am Dateiendefalse
Ein Fehler ist aufgetretenfalse

Da der Zeilenumbruch erhalten bleibt, reproduziert echo die Zeilenumbrüche der Datei. Wenn Sie diese nicht möchten, entfernen Sie sie mit rtrim($line, "\r\n").

Die Tatsache, dass fgets() am Dateiende false zurückgibt, lässt die untenstehende Leseschleife funktionieren — Sie benötigen nicht einmal feof().

So verwenden Sie fgets(): die drei Schritte

  1. Öffnen Sie die Datei mit fopen() in einem Lesemodus wie "r".
  2. Lesen Sie Zeile für Zeile mit fgets().
  3. Schließen Sie das Handle mit fclose(), wenn Sie fertig sind.

Die empfohlene Leseschleife

Das sauberste Muster nutzt den Rückgabewert false als Schleifenbedingung. Eine Zuweisung in PHP ergibt den zugewiesenen Wert, daher liest while (($line = fgets($file)) !== false) eine Zeile und prüft sie in einem Schritt:

<?php

$file = fopen("file.txt", "r");

if ($file === false) {
    exit("Could not open the file.\n");
}

while (($line = fgets($file)) !== false) {
    echo $line;          // newline is already part of $line
}

fclose($file);

Der strikte Vergleich !== false ist wichtig: Eine Zeile, die nur "0" enthält, ist in PHP „falsy", daher würde ein einfaches while ($line = fgets($file)) bei dieser Zeile vorzeitig enden. Vergleichen Sie immer mit !== false.

Zeile für Zeile mit feof() lesen

Sie werden die Schleife auch mit feof() geschrieben sehen, das true zurückgibt, sobald das Dateiende erreicht wurde:

<?php

$file = fopen("file.txt", "r");

while (!feof($file)) {
    $line = fgets($file);
    if ($line === false) {
        break;          // guard against a read failure mid-loop
    }
    echo $line;
}

fclose($file);

Beide Stile sind korrekt. Die !== false-Variante wird in der Regel bevorzugt, da feof() erst true wird, nachdem ein Lesevorgang fehlgeschlagen ist — was bei Unachtsamkeit zu einer zusätzlichen leeren Iteration führen kann.

Die Zeilenlänge begrenzen

Übergeben Sie $length, um zu steuern, wie viel einer langen Zeile auf einmal gelesen wird. Hier werden nur die ersten 9 Bytes ($length - 1) jedes Abschnitts zurückgegeben:

<?php

$file = fopen("file.txt", "r");

// "Hello, world!" is read in pieces of at most 9 bytes
echo fgets($file, 10);   // "Hello, wo"
echo "\n";
echo fgets($file, 10);   // "rld!" (rest of the line)

fclose($file);

Das ist praktisch, um sich vor extrem langen Zeilen zu schützen, aber bei normalen Textdateien können Sie $length weglassen.

Benutzereingaben vom Terminal lesen

Da fgets() auf jedem Stream funktioniert, ist es die klassische Methode, um eine vom Benutzer auf der Kommandozeile eingetippte Zeile zu lesen:

<?php

echo "What is your name? ";
$name = rtrim(fgets(STDIN), "\r\n");  // strip the Enter key's newline
echo "Hello, $name!\n";

STDIN ist eine vordefinierte Konstante für php://stdin.

Häufige Stolperfallen

  • Der abschließende Zeilenumbruch ist enthalten. Verwenden Sie rtrim($line, "\r\n") beim Vergleichen oder Speichern von Werten.
  • Mit !== false testen, nicht nur auf Wahrheitswert prüfen, damit Zeilen wie "0" oder "" die Schleife nicht vorzeitig beenden.
  • fgets() benötigt ein gültiges, geöffnetes Handle. Wenn fopen() false zurückgegeben hat (fehlende Datei, falsche Berechtigungen), löst die Übergabe an fgets() eine Warnung aus. Prüfen Sie das Handle zuerst.
  • Vergessen Sie fclose() nicht. PHP schließt Handles am Skriptende, aber sie explizit freizugeben ist gute Praxis, besonders in lang laufenden Skripten.
  • Für das Lesen ganzer Dateien sind einfachere Werkzeuge zu bevorzugen. Wenn Sie keine zeilenweise Kontrolle benötigen, gibt file() die Datei als array von Zeilen zurück und file_get_contents() gibt sie als einzelnen string zurück.

Verwandte Funktionen

  • fopen() — eine Datei oder einen Stream öffnen (vor fgets() erforderlich).
  • fread() — eine feste Anzahl von Bytes lesen, keine Zeilen.
  • fgetc() — ein einzelnes Zeichen lesen.
  • fgetcsv() — eine Zeile lesen und als CSV parsen.
  • feof() — auf Dateiende prüfen.
  • fclose() — das Handle schließen.

Fazit

fgets() liest eine Datei Zeile für Zeile und gibt jede Zeile (mit Zeilenumbruch) zurück, bis das Dateiende erreicht ist, wo false zurückgegeben wird. Kombinieren Sie es mit fopen() und fclose(), steuern Sie die Schleife mit einem strikten !== false-Test und denken Sie daran, rtrim() auf den Zeilenumbruch anzuwenden, wenn Sie den bereinigten Wert benötigen. Bei sehr großen Dateien hält dies die Speicherauslastung konstant niedrig und macht fgets() zur ersten Wahl für das Streaming von Text in PHP.

Übung

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