Signatur
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
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);
?>
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;
?>
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);
?>
// 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.