Signatur
Beschreibung
fprintf() funktioniert ähnlich wie printf(), schreibt den formatierten String jedoch nicht auf die Standardausgabe, sondern in einen zuvor geöffneten Stream-Handle. Dies macht die Funktion besonders nützlich beim Schreiben von Daten in Dateien, Netzwerk-Sockets oder andere Stream-Ressourcen.
Der $format-Parameter folgt denselben Regeln wie bei sprintf(): Platzhalter beginnen mit % und können Typspezifikatoren wie %s (String), %d (Integer), %f (Float), %05d (mit Auffüllung) usw. enthalten. Mittels Argument-Nummerierung (%1$s) lassen sich Argumente mehrfach oder in anderer Reihenfolge verwenden.
Im Gegensatz zu fwrite() übernimmt fprintf() die Formatierung direkt, ohne dass zuvor ein separater String mit sprintf() erstellt werden muss. Das macht den Code kompakter und lesbarer, wenn formatierte Daten in Streams geschrieben werden sollen.
Ein typischer Anwendungsfall ist das Schreiben von CSV-Dateien, Log-Einträgen oder anderen strukturierten Textdaten in Dateien.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $handle Pflicht | resource | Ein gültiger Stream-Handle, der z. B. durch fopen() oder popen() geöffnet wurde und Schreibzugriff besitzt. |
|
| $format Pflicht | string | Der Formatierungs-String mit Platzhaltern wie %s, %d, %f usw. Folgt den gleichen Regeln wie bei sprintf(). |
|
| $values | mixed | Beliebig viele Werte, die in den Formatierungs-String eingesetzt werden. Die Anzahl muss mit den Platzhaltern im $format-String übereinstimmen (außer bei Argument-Nummerierung). |
Rückgabewert
int zurück. Im Fehlerfall wird false zurückgegeben.Beispiele
Formatierte Daten in eine Datei schreiben
<?php
$handle = fopen('ausgabe.txt', 'w');
if ($handle === false) {
die('Datei konnte nicht geöffnet werden.');
}
$produkte = [
['Apfel', 0.49, 10],
['Banane', 0.29, 25],
['Kirsche', 1.99, 5],
];
foreach ($produkte as [$name, $preis, $menge]) {
fprintf($handle, "%-10s %6.2f EUR Menge: %3d\n", $name, $preis, $menge);
}
fclose($handle);
echo 'Datei erfolgreich geschrieben.';
Log-Einträge mit Zeitstempel in eine Datei schreiben
<?php
$logfile = fopen('app.log', 'a');
if ($logfile === false) {
die('Log-Datei konnte nicht geöffnet werden.');
}
$level = 'INFO';
$message = 'Benutzer hat sich angemeldet.';
$user = 'max.mustermann';
$bytesGeschrieben = fprintf(
$logfile,
"[%s] [%-5s] Benutzer: %-20s – %s\n",
date('Y-m-d H:i:s'),
$level,
$user,
$message
);
echo "Bytes geschrieben: " . $bytesGeschrieben;
fclose($logfile);
Ausgabe in STDOUT (Standardausgabe) schreiben
<?php
// STDOUT ist ein bereits geöffneter Stream in CLI-Skripten
$anzahl = fprintf(STDOUT, "Hallo, %s! Du bist Benutzer Nr. %05d.\n", 'Welt', 42);
echo PHP_EOL . "Bytes ausgegeben: " . $anzahl;
// Wichtig · Fallstricke
Stream muss schreibbar sein: Der übergebene Handle muss mit einem Schreib-Modus (w, a, w+ usw.) geöffnet worden sein, sonst schlägt der Schreibvorgang fehl.
Unterschied zu printf(): printf() schreibt immer auf die Standardausgabe (STDOUT). Mit fprintf() kann ein beliebiger Stream als Ziel angegeben werden, was fprintf(STDOUT, ...) funktional äquivalent zu printf() macht.
Zeichenkodierung: fprintf() arbeitet byte-orientiert. Bei Multibyte-Zeichenkodierungen (z. B. UTF-8) entsprechen Breitenangaben im Format-String der Byte-Anzahl, nicht der Anzahl der Zeichen. Für Multibyte-sichere Formatierung sollte auf manuelle Vorformatierung mit mb_*-Funktionen zurückgegriffen werden.