fgetc()
Die PHP-Funktion fgetc() liest ein einzelnes Zeichen aus einem Datei-Pointer und ist unverzichtbar für Entwickler und Serveradministratoren.
Einführung in die PHP-Funktion fgetc()
Die Funktion fgetc() in PHP liest genau ein Zeichen aus einer geöffneten Datei und setzt den Datei-Pointer um ein Byte weiter. Der Name steht für „file get character" (Zeichen aus Datei lesen). Jeder Aufruf gibt das nächste Zeichen zurück, sodass Sie durch wiederholtes Aufrufen eine Datei zeichenweise durchlaufen können.
Sie greifen auf fgetc() zurück, wenn Sie eine feingranulare, zeichenweise Kontrolle benötigen — zum Beispiel beim Aufbau eines einfachen Parsers, beim Zählen bestimmter Zeichen oder wenn Sie die Verarbeitung beim Erreichen eines bestimmten Bytes stoppen möchten. Für den üblichen Datei-Lesealltag sind zeilenbasiertes fgets() oder ganzdateibasiertes fread()/file_get_contents() schneller und einfacher, da jeder fgetc()-Aufruf einen Funktionsaufruf-Overhead verursacht. Zu wissen, wann man es nicht einsetzt, ist genauso wichtig wie zu wissen, wie man es benutzt.
Diese Seite behandelt die Syntax, Parameter, Rückgabewerte, ausführbare Beispiele und häufige Fallstricke (insbesondere die "0"-EOF-Falle).
Syntax
fgetc(resource $stream): string|falseDie Funktion nimmt ein einzelnes Argument entgegen und gibt entweder das gelesene Zeichen oder false zurück.
Parameter
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$stream | Ja | Ein geöffneter Datei-Pointer. Er muss eine gültige Ressource sein, die von fopen(), fsockopen(), popen() oder einer ähnlichen Funktion zurückgegeben wurde — kein Dateiname. |
Der Typ
resourcewird in PHP 8+ vollständig unterstützt. Für moderne Kompatibilität sind keine Änderungen erforderlich.
Rückgabewerte
- Bei Erfolg wird ein string zurückgegeben, der ein einzelnes Zeichen aus der Datei enthält.
- Gibt
falsezurück, wenn das Dateiende (EOF) erreicht ist oder ein Fehler auftritt.
Beispiele
Beispiel 1: Ein einzelnes Zeichen aus einer Datei lesen
Dies liest nur das erste Zeichen der Datei. Prüfen Sie immer, ob fopen() erfolgreich war, bevor Sie das Handle verwenden, und schließen Sie die Datei mit fclose(), wenn Sie fertig sind.
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
echo fgetc($fileHandle); // prints the first character
fclose($fileHandle);
}Beispiel 2: Eine ganze Datei zeichenweise lesen
Um die gesamte Datei zu lesen, rufen Sie fgetc() in einer Schleife auf und stoppen, wenn es false (EOF) zurückgibt.
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
while (($char = fgetc($fileHandle)) !== false) {
echo $char;
}
fclose($fileHandle);
}Dies gibt jedes Zeichen der Datei bis zum EOF aus.
Warum !== false wichtig ist (die „0"-Falle)
Ein sehr häufiger Fehler ist das Schreiben der Schleife mit einem lockeren Vergleich:
// BUGGED: stops early on the first "0" or "" it reads
while ($char = fgetc($fileHandle)) {
echo $char;
}PHP behandelt die Strings "0" und "" als falsy. Wenn Ihre Datei ein 0-Zeichen enthält, endet diese Schleife dort statt beim EOF. Verwenden Sie immer den strikten Identitätsvergleich !== false, sodass nur der echte EOF-Wert die Schleife beendet. Dieselbe Regel gilt für fgets() und fread().
Beispiel 3: Vorkommen eines Zeichens zählen
Da fgetc() Ihnen jeweils ein Zeichen liefert, eignet es sich gut für das zeichenweise Zählen, ohne die gesamte Datei in den Speicher zu laden:
<?php
$fileHandle = fopen('example.txt', 'r');
$vowels = 0;
if ($fileHandle) {
while (($char = fgetc($fileHandle)) !== false) {
if (str_contains('aeiouAEIOU', $char)) {
$vowels++;
}
}
fclose($fileHandle);
echo "Vowels: $vowels";
}fgetc() vs. fgets() vs. fread()
| Funktion | Liest | Verwenden wenn |
|---|---|---|
fgetc() | Ein Zeichen | Sie zeichengenaue Kontrolle benötigen oder bei einem bestimmten Byte stoppen möchten |
fgets() | Eine Zeile (bis zu einem Zeilenumbruch) | Sie Text zeilenweise verarbeiten |
fread() | Eine feste Anzahl von Bytes | Sie Binärdaten oder große Datenblöcke auf einmal lesen |
Für Binärdateien bevorzugen Sie fread() — eine Schleife mit fgetc() funktioniert, ist aber pro Byte deutlich langsamer.
Hinweise und Fallstricke
fgetc()funktioniert auf binärsicheren Streams: Es gibt ein Byte zurück, auch bei Nicht-Text-Zeichen. Mehrbyte-UTF-8-Zeichen umfassen mehrere Bytes, sodass ein einzelnerfgetc()-Aufruf möglicherweise nur einen Teil eines solchen Zeichens zurückgibt.- Öffnen Sie die Datei mit dem richtigen Modus (
'r','rb'usw.) überfopen(), und vergessen Sie nicht, sie mitfclose()zu schließen. - Sie können das Dateiende auch explizit mit
feof()prüfen, obwohl der Vergleich vonfgetc()mitfalsein der Regel ausreichend ist.
Fazit
fgetc() liest jeweils ein Zeichen aus einem geöffneten Datei-Pointer und gibt false am Dateiende zurück, was es ideal für zeichengenaues Parsen und Zählen macht. Denken Sie an die zwei wesentlichen Punkte: Übergeben Sie eine geöffnete Ressource von fopen(), und beenden Sie Ihre Leseschleife mit dem strikten !== false-Check, damit ein buchstäbliches 0 die Schleife nicht vorzeitig stoppt. Für zeilen- oder blockbasierte Arbeit greifen Sie stattdessen auf fgets() oder fread() zurück.
Weitere Informationen zur Arbeit mit Dateien in PHP finden Sie im PHP-Leitfaden zur Dateiverarbeitung.