fprintf в C/C++: разбираемся с примерами
👋 Привет! В этой статье мы поговорим о функции fprintf
. В отличие от функции printf
, она выводит результат форматирования не на экран, а в нужный нам файл. В начале мы посмотрим на пример использования этой функции, а потом подробно рассмотрим спецификаторы формата, которы е можно использовать. В конце статьи вы найдете упражнения для закрепления материала.
Как отформатировать строку используя fprintf
Функция fprintf
объявлена в заголовочном файле <stdio.h>
. В C++ вы также можете использовать <cstdio>
.
fprintf
форматирует строку как printf
, но записывает результат работы в нужный файл, вместо того, чтобы вывести строку в стандартный вывод.
Прототип этой функции выглядит следующим образом:
int fprintf ( FILE * stream, const char * format, ... );
- Первым аргументом функция принимает указатель на объект
FILE
, в который будет записан результат ее работы. - Вторым аргументом передается строка форматирования. Модификаторы, которые можно использовать будут рассмотрены ниже.
- Далее передаются дополнительные аргументы. Их количество зависит от используемых спецификаторов формата в строке форматирования (второй аргумент).
- Возвращает функция длину отформатированной строки (как и
printf
).
Теперь давайте посмотрим на простой пример использования этой функции:
#include <stdio.h>
int main() {
FILE * f = fopen("output.txt", "w");
fprintf(f, "число: %d", 1234);
fclose(f);
return 0;
}
Содержимое файла output.txt
:
число: 1234
В этой программе мы:
- Открываем файл
output.txt
с помощью функцииfopen
на запись. - Используем функцию
fprintf
для записи строки в этот файл. - Закрываем открытый файл.
Какой будет результат выполнения следующего кода?
#include <cstdio>
int main() {
FILE * f = fopen("output.txt", "w");
int res = fprintf(f, "x = %d", 1234);
fclose(f);
return 0;
}
output.txt
будет создан, но останется пустым.output.txt
не будет создан.output.txt
будет создан с содержимым “число: 1234”, а res
будет равен 8.output.txt
будет создан с содержимым “число: 1234”, но res
будет равен 0.Также, fprintf
можно использовать для вывода на экран. Для этого нужно просто передать указатель на стандартный вывод stdout
в первый аргумент этой функции:
#include <stdio.h>
int main() {
fprintf(stdout, "число: %d \n", 1234);
return 0;
}
Вывод программы на экран:
число: 1234
Спецификаторы формата
Спецификатор формата имеет следующую структуру (в квадратных скобках опциональные модификаторы):
%[флаги][ширина][.точность][размер]тип
Обязательно нужно указать только знак вопроса и тип. Остальное можно опустить если вас устраивает вывод без них.
Тут довольно много различных модификаторов. Некоторые из них мы уже использовали выше, но большинство мы еще не встречали. Давайте пройдемся по каждому из них:
Тип
Тип | Описание | Пример | Файл f |
---|---|---|---|
d /i | Выводит целое число |
|
|
u | Выводит целое число без знака | fprintf(f, "%u", 1234); | 1234 |
o | Выводит целое восьмеричное число без знака | fprintf(f, "%o", 1234); | 2322 |
x | Выводит целое число без знака в шестнадцатеричной системе | fprintf(f, "%x", 1234); | 4d2 |
X | Как x , только большими буквами | fprintf(f, "%X", 1234); | 4D2 |
f | Выводит дробное число | fprintf(f, "%f", 12.34); | 12.340000 |
F | Как f , только большими буквами | fprintf(f, "%F \n", 1. / 0); | INF |
e | Выводит дробное число в экспоненциальной записи | fprintf(f, "%e", 12.34); | 1.234000e+01 |
E | Как e , только большими буквами | fprintf(f, "%E", 1234.); | 1.234000E+03 |
g | Выводит дробное число, используя экспоненциальную запись если она короче |
|
|
G | Как g , но большими буквами |
|
|
a | Выводит дробное число в шестнадцатеричной системе | fprintf(f, "%a", -12.34); | -0x1.8ae147p+3 |
A | Как a , только большими буквами | fprintf(f, "%A", -12.34); | -0X1.8AE147P+3 |
c | Выводит символ | fprintf(f, "%c", 'C'); | C |
s | Выводит строку | fprintf(f, "%s", "C++"); | C++ |
p | Выводит указатель |
| 0x104ddc000 |
n | Ничего не выводит. fprintf сохранит количество символов, которые были записаны в файл до этого момента, в указатель переданный в соответствующем аргументе. |
| n = 4 |
% | Выводит процент | fprintf(f, "%%"); | % |
Флаги
Флаг | Описание | Пример | Файл f |
---|---|---|---|
- | Выравнивает по левому краю |
|
|
+ | Выводит + для положительных чисел |
|
|
| Выводит для положительных чисел |
|
|
# | Выводит 0 , 0x , 0X перед числами типа %o , %x , %X соответственно (кроме нуля). Для дробных чисел выводит дробную часть независимо от ее наличия. |
|
|
0 | Выводит нули вместо пробела, когда указана ширина |
|
|
Ширина
Ширина | Описание | Пример | Файл f |
---|---|---|---|
число | Выводит минимальное число символов |
|
|
* | Как число, только оно передается в соответствующем аргументе |
|
|
Точность
Точность | Описание | Пример | Файл f |
---|---|---|---|
.число | Для целых чисел ( Для дробных ( Для Для строк ( Если после точки число не указано, подразумевается ноль. |
|
|
* | Как число, только оно передается в соответствующем аргументе |
|
|
Размер
Модификаторы размера нам нужны, потому что в C нет возможности понять размер переданного аргумента в fprintf
. Давайте посмотри на простой пример, чтобы продемонстрировать о чем я говорю:
FILE * f = fopen("output.txt", "w");
long long int x = 10000000000; // десять миллиардов
fprintf(f, "%d\n", x);
Содержание файла:
1410065408
Дело здесь в том, что fprintf
ожидает int
для спецификатора %d
. Значение типа long long int
просто не влезает, поэтому мы видим не то, что ожидали.
Чтобы решить эту проблему, нужно явно указать размер целого числа, которое нужно вывести:
FILE * f = fopen("output.txt", "w");
long long int x = 10000000000; // десять миллиардов
fprintf(f, "%lld\n", x);
Содержание файла:
10000000000
Теперь содержание файла соответствует нашим ожиданиям. Вот таблица возможных типов:
Размер | Тип |
---|---|
hh |
|
h |
|
l |
|
ll |
|
j |
|
z |
|
t |
|
L |
|
Упражнения
-
Использование
fprintf
для записи в файл:
Напишите программу на C++, которая запрашивает у пользователя целое число и строку, а затем записывает их в файл с использованием функцииfprintf
. После этого, программа должна считывать и выводить содержимое файла. -
Форматирование строки с
fprintf
:
Измените программу из первого задания так, чтобы пользователь мог вводить несколько чисел (целых и вещественных) и строк. Ваша программа должна форматировать и записывать их в файл с использованием различных спецификаторов формата. -
Сравнение
fprintf
иprintf
:
Напишите программу, которая демонстрирует различия (или их отсутствие) междуfprintf
иprintf
. Ваша программа должна использовать обе функции для вывода строки с переменными, и результаты их работы должны быть записаны в файл и выведены на экран соответственно.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение