Fprintf: примеры (PHP)

Использование fprintf для форматированного вывода в PHP
Раздел: Работа с файлами
fprintf(resource $stream, string $format, mixed ...$values): int

Описание функции fprintf

Функция fprintf() записывает форматированную строку в поток, указанный дескриптором. Она используется, когда требуется записать в файл или другой поток данные с определенным форматированием.

Аргументы функции
  • $stream (resource) – обязательный аргумент. Дескриптор файлового потока, полученный с помощью функций типа fopen() или fsockopen().
  • $format (string) – обязательный аргумент. Строка формата, определяющая, как будут обработаны последующие аргументы. Содержит обычные символы и спецификаторы преобразования.
  • ...$values (mixed) – переменное количество аргументов. Значения, которые будут подставлены в спецификаторы преобразования в строке формата.
Спецификаторы формата

Основные спецификаторы: %b (двоичное), %c (символ), %d (целое со знаком), %e (научная нотация), %f (число с плавающей точкой), %o (восьмеричное), %s (строка), %u (целое без знака), %x (шестнадцатеричное в нижнем регистре), %X (шестнадцатеричное в верхнем регистре).

Базовые примеры использования

Запись чисел и строк в файл
$fp = fopen('output.txt', 'w');
$count = fprintf($fp, 'Число: %d, Строка: %s', 42, 'текст');
// $count содержит количество записанных байт
fclose($fp);
Содержимое файла output.txt: 'Число: 42, Строка: текст'
Форматирование чисел
$fp = fopen('test.txt', 'w');
fprintf($fp, 'Десятичное: %d, Двоичное: %b, Шестнадцатеричное: %X', 255, 255, 255);
fclose($fp);
Содержимое файла: 'Десятичное: 255, Двоичное: 11111111, Шестнадцатеричное: FF'
Использование флагов и точности
$fp = fopen('format.txt', 'w');
fprintf($fp, 'Заполнение нулями: %05d\n', 17);
fprintf($fp, 'Плавающая точка: %.2f\n', 3.14159);
fprintf($fp, 'Научная нотация: %.2e\n', 123456.789);
fclose($fp);
Содержимое файла:
Заполнение нулями: 00017
Плавающая точка: 3.14
Научная нотация: 1.23e+5

Похожие функции в PHP

printf() и sprintf()

Функция printf() выводит форматированную строку напрямую в стандартный вывод, а sprintf() возвращает форматированную строку как результат. fprintf() используется, когда нужна запись в конкретный файловый поток.

vfprintf()

Функция vfprintf() идентична fprintf(), но принимает аргументы для форматирования в виде массива, что удобно при динамическом формировании параметров.

Функция fwrite() записывает в файловый поток обычную строку без поддержки форматирования. Ее применяют, когда не требуется сложное преобразование данных.

Аналоги в других языках

Fprintf в Python

# Метод write не форматирует, используется в связке с format
with open('output.txt', 'w') as f:
    f.write('Число: {}, Строка: {}'.format(42, 'текст'))

# Или с f-строками (Python 3.6+)
value = 42
text = 'текст'
with open('output.txt', 'w') as f:
    f.write(f'Число: {value}, Строка: {text}')
JavaScript (Node.js)
const fs = require('fs');
const value = 42;
const text = 'текст';
fs.writeFileSync('output.txt', `Число: ${value}, Строка: ${text}`);
// Шаблонные строки предоставляют базовое форматирование

Fprintf в C

#include 
int main() {
    FILE *fp = fopen('output.txt', 'w');
    fprintf(fp, "Число: %d, Строка: %s", 42, "текст");
    fclose(fp);
    return 0;
}

Синтаксис C очень похож на PHP, который унаследовал многие функции форматированного вывода из языка C.

Типичные ошибки

Передача неверного дескриптора
// Ошибка: передача строки вместо ресурса
fprintf('output.txt', 'Текст: %s', 'данные');
Warning: fprintf() expects parameter 1 to be resource, string given
Несоответствие количества аргументов
$fp = fopen('test.txt', 'w');
// Указано два спецификатора, но передан один аргумент
fprintf($fp, 'Значения: %d и %s', 10);
fclose($fp);
Warning: Undefined array key 1 in ...
Содержимое файла может быть некорректным
Использование несуществующего спецификатора
$fp = fopen('test.txt', 'w');
// Спецификатор %z не существует
fprintf($fp, 'Ошибка: %z', 123);
fclose($fp);
Warning: Unknown format specifier "z" in ...

Изменения в последних версиях PHP

PHP 8.0

Начиная с PHP 8.0, при несоответствии количества аргументов количеству спецификаторов в строке формата, функция выбрасывает исключение ValueError. В предыдущих версиях возникало предупреждение и функция возвращала false.

// В PHP 8.0 и выше
$fp = fopen('test.txt', 'w');
try {
    fprintf($fp, 'Значения: %d и %s', 10);
} catch (ValueError $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
fclose($fp);
Ошибка: 2 arguments are required, 1 given

Расширенные примеры

Запись в поток stderr
Пример php
// Запись сообщения об ошибке в стандартный поток ошибок
$stderr = fopen('php://stderr', 'w');
fprintf($stderr, '[%s] Ошибка: %s\n', date('Y-m-d H:i:s'), 'Файл не найден');
fclose($stderr);
Форматирование таблицы данных
Пример php
$data = [
    ['Иван', 28, 45000.50],
    ['Мария', 32, 52000.75],
    ['Петр', 25, 39000.00]
];

$fp = fopen('table.txt', 'w');
fprintf($fp, "%-15s %-5s %-10s\n", 'Имя', 'Возраст', 'Зарплата');
fprintf($fp, str_repeat('-', 35) . "\n");

foreach ($data as $row) {
    fprintf($fp, "%-15s %-5d $%-9.2f\n", $row[0], $row[1], $row[2]);
}
fclose($fp);
Содержимое файла table.txt:
Имя             Возраст Зарплата   
-----------------------------------
Иван            28     $45000.50  
Мария           32     $52000.75  
Петр            25     $39000.00
Генерация CSV с форматированием
Пример php
$products = [
    ['Ноутбук', 15, 899.99],
    ['Мышь', 120, 19.50],
    ['Клавиатура', 45, 49.99]
];

$fp = fopen('catalog.csv', 'w');
foreach ($products as $product) {
    // Форматирование каждого поля с разной точностью
    fprintf($fp, '%s,%03d,%.2f\n', $product[0], $product[1], $product[2]);
}
fclose($fp);
Содержимое catalog.csv:
Ноутбук,015,899.99
Мышь,120,19.50
Клавиатура,045,49.99
Использование с сокетами
Пример php
// Отправка форматированных данных через сокет
$socket = fsockopen('udp://127.0.0.1', 12345);
if ($socket) {
    $value = 3.14159265;
    fprintf($socket, 'VALUE %.4f\n', $value);
    fclose($socket);
}
Работа с пользовательскими числовыми системами
Пример php
$fp = fopen('numbers.txt', 'w');
$number = 255;
// Вывод одного числа в разных системах счисления
fprintf($fp, 'Десятичная: %d\n', $number);
// Восьмеричная с префиксом
fprintf($fp, 'Восьмеричная: 0%o\n', $number);
// Шестнадцатеричная с префиксом и нижним регистром
fprintf($fp, 'Шестнадцатеричная: 0x%x\n', $number);
// Двоичная (эмуляция с помощью decbin)
fprintf($fp, 'Двоичная: %s\n', decbin($number));
fclose($fp);

PHP fprintf function comments

En
Fprintf Write a formatted string to a stream