Start · Sprachen · PHP · Referenz · fgetc

fgetc

Funktion

Liest ein einzelnes Zeichen aus dem Datei-Stream, auf den der Dateizeiger aktuell zeigt.

seit PHP 4.0.0 Kategorie: io

Signatur

fgetc(resource $stream): string|false

Beschreibung

fgetc() liest genau ein Zeichen aus dem übergebenen Datei- oder Stream-Handle und rückt den internen Dateizeiger um eine Position vor. Die Funktion ist besonders nützlich, wenn eine Datei oder ein Stream zeichenweise verarbeitet werden muss – etwa beim Parsen von Formaten, bei denen der Inhalt Zeichen für Zeichen ausgewertet wird.

Im Gegensatz zu fgets() (zeilenweise) oder fread() (blockweise) ermöglicht fgetc() eine sehr feinkörnige Kontrolle über den Leseprozess. Das kann allerdings bei großen Dateien zu einem Geschwindigkeitsnachteil führen, da für jedes Zeichen ein eigener Funktionsaufruf nötig ist.

Die Funktion gibt false zurück, sobald das Dateiende (EOF) erreicht ist oder ein Fehler auftritt. In Kombination mit feof() lässt sich daher einfach über den gesamten Inhalt iterieren. Alternativ genügt es, den Rückgabewert direkt mit false zu vergleichen.

Neben regulären Dateien kann fgetc() auch auf Netzwerk-Streams, Pipes und andere Stream-Ressourcen angewendet werden, sofern diese lesbar sind.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource Ein gültiges Datei-Handle, das zuvor mit fopen(), popen() oder einer ähnlichen Funktion geöffnet wurde und im Lesemodus zugänglich ist.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen String mit genau einem Zeichen zurück, das am aktuellen Zeiger ausgelesen wurde. Am Ende der Datei (EOF) oder im Fehlerfall wird false zurückgegeben.

Beispiele

Datei zeichenweise ausgeben

<?php
$handle = fopen('beispiel.txt', 'r');
if ($handle === false) {
    die('Datei konnte nicht geöffnet werden.');
}

while (($zeichen = fgetc($handle)) !== false) {
    echo $zeichen;
}

fclose($handle);
?>
(Inhalt der Datei beispiel.txt, Zeichen für Zeichen)

Zeichen zählen bis zum ersten Zeilenumbruch

<?php
$handle = fopen('beispiel.txt', 'r');
if ($handle === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$anzahl = 0;
while (($zeichen = fgetc($handle)) !== false) {
    if ($zeichen === "\n") {
        break;
    }
    $anzahl++;
}

fclose($handle);
echo "Zeichen in der ersten Zeile: " . $anzahl;
?>
Zeichen in der ersten Zeile: 42

Verwendung mit einem Netzwerk-Stream

<?php
// Lese zeichenweise von STDIN (z. B. in einem CLI-Skript)
$handle = fopen('php://stdin', 'r');
echo "Erstes eingegebenes Zeichen: ";
$zeichen = fgetc($handle);
if ($zeichen !== false) {
    echo $zeichen . PHP_EOL;
}
fclose($handle);
?>
Erstes eingegebenes Zeichen: A

// Wichtig · Fallstricke

Performance-Hinweis: Das zeichenweise Lesen mit fgetc() ist deutlich langsamer als das blockweise Lesen mit fread(). Bei großen Dateien empfiehlt es sich, größere Blöcke zu lesen und dann im Speicher zeichenweise zu verarbeiten.

Vergleich mit false: Da der leere String '' in PHP zu false evaluiert, muss der Rückgabewert zwingend mit dem Identitätsoperator !== (und nicht !=) verglichen werden, um EOF sicher zu erkennen.

Multibyte-Zeichen: fgetc() ist nicht Multibyte-fähig – es liest stets genau ein Byte. Bei UTF-8-kodierten Dateien mit Nicht-ASCII-Zeichen kann ein einzelner Aufruf nur einen Teil eines Zeichens liefern. In solchen Fällen sollte auf fread() mit entsprechender Byte-Länge oder eine Multibyte-Bibliothek zurückgegriffen werden.