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-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение