ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4284
Скачиваний: 28
Часть III. Стандартная библиотека языка программирования C
356
нием текущего аргумента функции
fprintf
. Если это число отри-
цательное, то знак минус рассматривается как флаг, который вы-
равнивает вывод влево, а величина числа определяет ширину по-
ля вывода.
Для вывода одного символа используется следующий формат:
%[-][0][ширина][h|l]c
где:
h
обозначает однобайтовый символ;
l
обозначает широкий (wide) символ;
c
обозначает данные типа
char
.
Для вывода строки используется следующий формат:
%[-][0][ширина][.точность][h|l]s
где:
точность
задает максимальное количество выводимых сим-
волов;
h
обозначает строку однобайтовых символов;
l
обозначает строку широких (wide) символов;
s
обозначает, что выводится строка.
Для вывода целого числа со знаком используется следующий
формат:
%[-][+|пробел][0][ширина][.точность][h|l]{d|i}
где:
+
выводит знак
+
для положительных чисел, заметим, что для
отрицательных чисел всегда выводится знак
-
;
пробел
выводит пробел в позицию знака, если число положи-
тельное;
точность
задает минимальное количество цифр, которые
должны быть выведены, если цифр меньше, то пустые места
заполняются пробелами или нулями в зависимости от уста-
новленного флага;
h
обозначает модификатор типа
short
;
Глава 30. Функции для работы с файлами <stdio.h>
357
l
обозначает модификатор типа
long
;
d
обозначает число типа
int
;
i
обозначает число типа
int
.
Для вывода целого числа без знака используется следующий
формат:
%[-][#][0][ширина][.точность][h|l]{u|o|x|X}
где:
#
выводит начальный
0
для чисел в восьмеричной системе
счисления или начальные
0x
или
0X
для чисел в шестнадцате-
ричной системе счисления;
точность
задает минимальное количество цифр, которые
должны быть выведены, если цифр меньше, то пустые места
заполняются пробелами или нулями в зависимости от уста-
новленного флага;
h
обозначает модификатор типа
short
;
l
обозначает модификатор типа данных
long
;
u
обозначает число типа
unsigned
, которое выводится в деся-
тичной системе счисления;
o
обозначает число типа
unsigned
, которое выводится в вось-
меричной системе;
x
обозначает число типа
unsigned
, которое выводится шест-
надцатеричной системе;
X
обозначает данные типа
unsigned
, которое выводится в
шестнадцатеричной системе.
Для вывода числа с плавающей точкой используется следующий
формат:
%[-][#][+|пробел][0][ширина][.точность][L]{f|e|E|g|G}
где:
#
в любом случае выводит десятичную точку для типов
f
,
e
или
E
, а для типов
g
и
G
, кроме того, предотвращает подавле-
ние завершающих нулей;
Часть III. Стандартная библиотека языка программирования C
358
+
выводит знак
+
для положительных чисел, заметим, что для
отрицательных чисел всегда выводится знак
-
;
пробел
выводит пробел в позицию знака;
точность
задает количество цифр после десятичной точки для
форматов
f
,
e
и
E
или количество значащих цифр для форма-
тов
g
и
G
. Числа округляются отбрасыванием. По умолчанию
принимается точность в шесть десятичных цифр;
L
обозначает модификатор типа данных
long
;
f
обозначает число с плавающей точкой типа
double
;
e
обозначает число с плавающей точкой типа
double
, которое
выводится в экспоненциальной форме, экспонента обознача-
ется буквой
'e'
;
E
обозначает число с плавающей точкой типа
double
, которое
выводится в экспоненциальной форме, экспонента обознача-
ется буквой
E
;
g
обозначает число с плавающей точкой типа
double
, для вы-
вода которого используется наиболее короткий из форматов
f
или
e
;
G
обозначает число с плавающей точкой типа
double
, для вы-
вода которого используется наиболее короткий из форматов
f
или
E
.
Для вывода указателя используется следующий формат:
%[-][+|пробел][ширина]p
где:
+
или
пробел
выравнивает поле вывода вправо;
p
обозначает данные типа
void*
.
Для определения количества символов, которые были успешно
записаны в поток вывода, используется следующий формат:
%[l]n
где:
l
обозначает модификатор типа
long
;
n
указывает, что аргумент должен быть указателем на тип
int
.
Глава 30. Функции для работы с файлами <stdio.h>
359
В этом случае аргумент функции
fprintf
должен быть указателем
на целую переменную. В эту переменную функция
fprintf
запи-
шет количество успешно выведенных символов.
В листинге 30.7 приведены примеры использования функции
fprintf
.
Листинг 30.7. Форматированный вывод
#include <stdio.h>
int main()
{
FILE *out;
int n = 0;
int *p = &n;
out = fopen("text.txt", "w");
fprintf(out, "c: %c\n", 'a'); /* a */
fprintf(out, "lc: %lc\n", L'a'); /* a */
fprintf(out, "s: %s\n", "string"); /* string */
fprintf(out, "ls: %ls\n", L"string"); /* string */
fprintf(out, "d: %d\n", -123); /* -123 */
fprintf(out, "d: %05d\n", -123); /* -0123 */
fprintf(out, "f: %f\n", 12.34); /* 12.340000 */
fprintf(out, "e: %e\n", 12.34); /* 1.234000 */
fprintf(out, "E: %E\n", 12.34); /* 1.234000 */
fprintf(out, "g: %g\n", 12.34); /* 12.34 */
fprintf(out, "G: %G\n", 12.34); /* 12.34 */
fprintf(out, "p: %p\n", p);
fprintf(out, "%c%n\n", 'a', p); /* a */
fprintf(out, "n = %d\n", n); /* n = 1 */
fclose(out);
return 0;
}
Часть III. Стандартная библиотека языка программирования C
360
30.12. Форматированный ввод
Для форматированного ввода данных используется функция
fscanf
, которая имеет следующий прототип:
int fscanf(FILE* stream, const char* format, ...);
Эта функция выполняет чтение данных из файла
stream
в соот-
ветствии с форматной строкой
format
. Параметр
format
должен
указывать на форматируемую строку, которая содержит специ-
фикации форматов ввода. Количество и типы аргументов, кото-
рые следуют после строки форматирования, должны соответст-
вовать количеству и типам форматов ввода, заданным в строке
форматирования. Если это условие не выполняется, то поведение
функции не определено. Кроме того, аргументы должны задавать
адреса переменных, в которые будут вводиться данные.
В случае успешного завершения функция возвращает количество
отформатированных данных. В случае ошибки функция устанав-
ливает индикатор ошибки и возвращает значение
EOF
. В случае
достижения конца файла функция устанавливает индикатор кон-
ца файла. Если при достижении конца файла не было выполнено
ни одного преобразования формата, то функция возвращает зна-
чение
EOF
.
Пробел, символы
\t
или
\n
в форматной строке описывают один
или более пробельных символов во входном потоке, к которым
относятся символы: пробел,
\t
,
\n
,
\v
и
\f
. Функция
fscanf
про-
пускает пустые символы во входном потоке.
Литеральные символы в форматной строке, за исключением сим-
вола
%
, требуют, чтобы во входном потоке появились точно такие
же символы. Если такого символа нет, то функция
fscanf
пре-
кращает ввод. Функция
fscanf
пропускает литеральные символы.
В общем случае спецификация формата ввода имеет вид:
%[*][ширина][модификатор]тип
где:
*
обозначает пропуск при вводе поля, определенного данной
спецификацией;