Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
88
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

11.8 Форматированный вывод

Рассмотренные выше функции выводят информацию в поток без или почти без преобразования. Функция fprintf преобразует выводимые данные в последовательность символов, руководствуясь строкой формата.

int fprintf (FILE *stream,

const char *format // строка формата

[, argument, ...] // выводимые значения

) — при успехе возвращает количество выведенных байт, при неудаче — EOF. Квадратные скобки говорят о необязательности аргумента

Строка формата содержит простые символы и спецификации формата. Простые символы копируются в выходной поток без изменения, спецификации применяются для форматирования остальных аргументов функции. Если аргументов меньше, чем спецификаций, последствия непредсказуемы. Если аргументов больше, чем спецификаций, лишние аргументы игнорируются.

Общий вид спецификации формата следующий:

%[флаги] [ширина] [.точность] [размер] тип

флаги — признаки выравнивания, использования знаков, десятичной точки, конечных нулей, 8-ичных и 16-ичных префиксов;

ширина — минимальное число печатаемых символов с учетом пробелов и нулей;

точность — максимальное число печатаемых символов (для целых — минимальное число цифр);

размер — определяет размер аргумента;

тип — символ спецификации типа — обязательный элемент формата.

З а д а ч а. Вывести в текстовый файл школьную таблицу умножения.

11.9 Форматированный ввод

Для форматированного ввода из потока применяют функцию

int fscanf (FILE *stream,

const char *format

[, address, ...]

) — возвращает число полей ввода отформатированных и размещенных в памяти. При неудаче возвращает EOF.

Функция fscanf рассматривает входной поток как последовательность полей ввода. Поле ввода заканчивается:

— первым символом пробела (но не включает его);

— первым символом, который не может быть преобразован по спецификации формата, сопоставленной этому полю;

— (n+1)-м символом, если спецификация включает ширину поля в n символов.

Функция просматривает последовательность полей ввода, форматирует их и размещает по адресам — аргументам fscanf. Число адресов, спецификаций формата и полей ввода должно быть согласовано.

Строка формата состоит из неотображаемых символов (' ',\t,\n), отображаемых символов (все прочие, кроме '%') и спецификаторов формата.

Если fscanf встречает неотображаемый символ в форматной строке, она будет считывать, но не сохранять все неотображаемые символы входного потока вплоть до первого отображаемого символа.

Если fscanf встречает отображаемый символ в форматной строке, она прочитает, но не сохранит соответствующий символ входного потока.

Спецификация формата предписывает fscanf чтение, преобразование и размещение в памяти одного входного поля.

Общий вид спецификации формата:

%[*] [ширина] [модиф. размера] [модиф. типа арг.] символ типа

* — отменяет присваивание поля ввода;

ширина — максимальное число считываемых символов;

модификатор размера — N — near, F — far;

модификатор типа аргумента — изменяет тип адресного аргумента;

символ типа — символ спецификации типа — обязательный элемент формата.

11.10 Другие функции форматного ввода и вывода

Ниже перечислены другие функции форматного ввода с указанием заголовочного файла и входного потока.

cprintf ¦ CONIO.H ¦ Консоль

fprintf ¦ STDIO.H ¦ Поток

printf ¦ STDIO.H ¦ stdout

sprintf ¦ STDIO.H ¦ Строка

То же для форматного вывода.

cscanf ¦ CONIO.H ¦ Консоль

fscanf ¦ STDIO.H ¦ Поток

scanf ¦ STDIO.H ¦ stdin

sscanf ¦ STDIO.H ¦ Строка

Вопросы

1. На какие группы можно разделить библиотечные функции ввода-вывода?

2. Что такое поток?

3. Можно ли открыть поток, не открывая файла?

4. Как открыть поток в двоичном режиме?

5. Что возвращает функция fopen?

6. Какая функция выводит символ в стандартный выводной поток?

7. Какие функции читают и записывают строку в поток?

8. Как установить указатель на конец потока, открытого для чтения?

9. Как проверить, достиг ли указатель потока конца файла?

10. Как проверить, нет ли ошибки при работе с потоком?

11. Можно ли сбросить индикатор ошибки, не закрывая потока?

12. Какая функция выполняет форматированный вывод в поток?

13. Чем отличается функция printf от функции fprintf?

14. Что такое поле ввода для функции fscanf?

15. Как устроена строка формата функции fscanf?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]