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() возвращает форматированную строку как результат. fprintf() используется, когда нужна запись в конкретный файловый поток.
Функция 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}')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, при несоответствии количества аргументов количеству спецификаторов в строке формата, функция выбрасывает исключение 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 = fopen('php://stderr', 'w');
fprintf($stderr, '[%s] Ошибка: %s\n', date('Y-m-d H:i:s'), 'Файл не найден');
fclose($stderr);$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
$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
// Отправка форматированных данных через сокет
$socket = fsockopen('udp://127.0.0.1', 12345);
if ($socket) {
$value = 3.14159265;
fprintf($socket, 'VALUE %.4f\n', $value);
fclose($socket);
}$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);