ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4283
Скачиваний: 28
Глава 30. Функции для работы с файлами <stdio.h>
361
ширина
задает максимальное количество символов, вводимых
по данной спецификации;
модификатор
уточняет тип аргумента;
тип
задает тип аргумента.
Для ввода массива символов используется следующий формат:
%[*][ширина][l]c
где:
ширина
задает количество символов, которые должны быть
введены из потока; если
ширина
опущена, то вводится один
символ;
l
указывает, что вводится массив широких (wide) символов;
c
указывает, что вводится массив символов.
Для ввода массива символов также используется следующий
формат:
%[*][ширина][l]s
где:
ширина
задает количество символов, которые должны быть
введены из потока; если
ширина
опущена, то вводится строка
символов до первого пробельного символа;
l
указывает, что вводится массив широких (wide) символов;
s
указывает, что вводится массив символов.
В этом случае по окончании ввода символов функция
fscanf
за-
писывает в массив пустой символ.
Для ввода целого числа со знаком используется следующий
формат:
%[*][ширина][h|l]{d|i}
где:
h
обозначает модификатор типа
short
;
l
обозначает модификатор типа
long
;
d
обозначает число типа
int
, которое записано в десятичной
системе счисления;
Часть III. Стандартная библиотека языка программирования C
362
i
обозначает число типа
int
, которое записано в восьмеричной
или шестнадцатеричной системе счисления.
Правила записи целых чисел, используя восьмеричную и шест-
надцатеричную системы счисления, совпадают с правилами обо-
значения числовых констант в этих же системах счисления.
Для ввода целого числа без знака используется следующий фор-
мат ввода:
%[*][ширина][h|l]{u|o|x|X}
где:
h
обозначает модификатор типа
short
;
l
обозначает модификатор типа данных
long
;
u
обозначает число типа
unsigned
, которое записано в десятич-
ной системе счисления;
o
обозначает число типа
unsigned
, которое записано в восьме-
ричной системе счисления;
x
и
X
обозначают число типа
unsigned
, которое записано в
шестнадцатеричной системе счисления.
Для ввода числа с плавающей точкой используется следующий
формат:
%[*][ширина][l|L]{f|e|E|g|G}
где:
l
обозначает, что вводится число с плавающей точкой в пере-
менную типа
double
;
L
обозначает, что вводится число с плавающей точкой в пере-
менную типа
long double
;
f
,
e
,
E
,
g
или
G
обозначает число с плавающей точкой, которое
вводится в переменную типа
float
. Это число может содер-
жать как точку, так и экспоненту, которая должна начинаться
с буквы
e
или
E
.
Для ввода указателя используется следующий формат:
%[*][ширина]p
где
p
обозначает, что вводится указатель.
Глава 30. Функции для работы с файлами <stdio.h>
363
Для определения количества символов, которые были успешно
прочитаны из потока ввода, используется следующий формат:
%[l]n
где:
l
обозначает модификатор типа
long
;
n
указывает, что аргумент должен быть адресом на указатель
типа
int*
или
long int*
.
В этом случае в переменную, на которую указывает аргумент,
функция
fscanf
запишет количество успешно введенных симво-
лов.
В листинге 30.8 приведены примеры использования функции
fscanf
.
Листинг 30.8. Форматированный ввод
#include <stdio.h>
int main()
{
FILE *out, *in;
char c;
char s[10];
int n;
unsigned m;
double d = 0.0;
char str[] = "a abcd -10 0x123 12.3E-1";
/* создаем текстовый файл */
out = fopen("text.txt", "w");
fputs(str, out); /* пишем строку в файл */
fclose(out);
/* открываем поток для чтения в текстовом режиме */
in = fopen("text.txt", "r");
/* читаем из входного потока */
fscanf(in, "%c", &c);
Часть III. Стандартная библиотека языка программирования C
364
printf("%c\n", c);
fscanf(in, "%s", s);
printf("%s\n", s);
fscanf(in, "%d", &n);
printf("%d\n", n);
fscanf(in, "%x", &m);
printf("%#x\n", m);
fscanf(in, "%lf", &d);
printf("%f\n", d);
fclose(in);
return 0;
}
30.13. Форматирование
и сканирование строк
Существуют варианты функций
fprintf
и
fscanf
, которые пред-
назначены для форматирования строк и называются соответст-
венно
sprintf
и
sscanf
.
Для форматирования строки предназначена функция
sprintf
, ко-
торая имеет следующий прототип:
int sprintf(char *buffer, const char *format, ...);
Эта функция форматирует строку в соответствии с форматом,
который задан параметром
format
, и записывает полученный ре-
зультат в символьный массив
buffer
. Возвращает функция коли-
чество символов, записанных в символьный массив
buffer
, ис-
ключая завершающий нулевой байт.
В листинге 30.9 приведен пример форматирования строки.
Листинг 30.9. Форматирование строки
#include <stdio.h>
int main()
Глава 30. Функции для работы с файлами <stdio.h>
365
{
char buffer[80];
char str[] = "c:%c d:%d g:%g s:%s";
char c = 'c';
int n = 10;
double d = 1.2;
char s[] = "The string";
sprintf(buffer, str, c, n, d, s);
printf("%s\n", buffer); /* c:c n:10 d:1.2 s:The string */
return 0;
}
Для сканирования строки предназначена функция
sscanf
, которая
имеет следующий прототип:
int sscanf(const char *str, const char *format, ...);
Эта функция читает данные из строки, заданной параметром
str
,
в соответствии с форматной строкой, заданной параметром
format
. В случае удачи функция возвращает количество отскани-
рованных полей. В случае ошибки или в случае, если по дости-
жении конца строки
str
не было отсканировано ни одного поля,
функция возвращает значение
EOF
.
В листинге 30.10 приведен пример сканирования строки.
Листинг 30.10. Сканирование строки
#include <stdio.h>
int main()
{
char str[] = "c 10 1.2 String No input";
char c;
int n;
double d;
char s[80];
sscanf(str, "%c %d %lf %s", &c, &n, &d, s);