Start · Sprachen · PHP · Referenz · fprintf

fprintf

Funktion

Schreibt einen formatierten String direkt in einen geöffneten Stream (z. B. Datei oder Standardausgabe).

seit PHP 5.0.0 Kategorie: string

Signatur

fprintf(resource $handle, string $format, mixed ...$values): int|false

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

Typ
int|false
Beschreibung
Gibt die Anzahl der in den Stream geschriebenen Bytes als 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.';
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);
Bytes geschrieben: 72

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;
Hallo, Welt! Du bist Benutzer Nr. 00042. Bytes ausgegeben: 41

// 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.