Форматный ввод из входного потока.
Форматный ввод из входного потока осуществляется функцией scanf(). Прототип функции scanf( ) имеет вид:
int scanf(const char * format, …);
При обращении к функции scanf() возможны две формы задания первого параметра:
int scanf ( форматная строка, список аргументов );
int scanf(указатель_на_форматную _строку, список_аргументов);
Функция scanf() читает последовательности кодов символов (байты) из входного потока и интерпретирует их в соответствии с форматной_строкой как целые числа, вещественные числа, одиночные символы, строки. В первом варианте вызова функции форматная строка размещается непосредственно в списке фактических параметров. Во втором варианте вызова предполагается, что первый фактический параметр - это указатель типа char *, адресующий собственно форматную строку. Форматная строка в этом случае должна быть определена в программе как обычная строковая константа или переменная.
После преобразования во внутреннее представление данные записываются в области памяти, определенные аргументами, которые следуют за форматной строкой. Каждый аргумент должен быть указателем на переменную, в которую будет записано очередное значение данных и тип которой соответствует типу, указанному в спецификации преобразования из форматной строки.
Если аргументов недостаточно для данной форматной строки, то результат зависит от реализации (от операционной системы и от системы программирования). Если аргументов больше, чем требуется в форматной строке, "лишние" аргументы игнорируются.
Последовательность кодов символов, которую функция scanf() читает, из входного потока, как правило, состоит из полей (строк), разделенных символами промежутка или обобщенными пробельными символами. Поля просматриваются и вводятся функцией scanf() посимвольно. Ввод поля прекращается, если встретился пробельный символ или в спецификации преобразования точно указано количество вводимых символа.
Функция scanf() завершает работу, если исчерпана форматная строка. При успешном завершении scanf() возвращает количество преобразованных и введенных полей (точнее, количество объектов, получивших значения при вводе). Значение EOF возвращается при возникновении ситуации "конец файла"; значение -1 - при возникновении ошибки преобразования данных.
Рассмотрим форматную строку функции scanf(): "code: %d %*s %c %s"
Строка "code:" присутствует во входном потоке для контроля вводимых данных и поэтому указана в форматной строке. Спецификации преобразования задают следующие действия:
%d - ввод десятичного целого;
%*s - пропуск строки;
%с - ввод одиночного символа;
%s - ввод строки.
Приведем результаты работы программы для трех различных наборов входных данных.
1.Последовательность символов исходных данных:
code: 5 поле2 D asd
Результат выполнения программы:
i=5 c=D s=asd ret=3
Значением переменной ret является код возврата функц»-scanf(). Число 3 говорит о том, что функция scanf() ввела данные без ошибки и было обработано 3 входных поля (строки "code:" и "поле2" пропускаются при вводе).
В данной работе были рассмотрены особенности операций ввода-вывода в языке програмирования Си/С++, в которых есть много общего. Рассмотрены понятия «функции» и «потока», их виды и особенности функционирования в языке программирования.
Боллее глубоко и подробно были рассмотрены потоковый ввод-вывод символов, его особенности работы. В работе для иллюстрации приведены фрагменты программ с кодом, которые показывают особенности реализации тех или иных функций ввода-вывода.
Литература
1. Подбельский В.В. Программирование на языке С. М.: Финансы и статистика, 1999.
2. В.В.Подбельский, С.С.Фомин «Язык Си++». – М.: Финансы и статистика, 2003.
3. Павловская Т.А., Щупак Ю.А. С/С++. Структур-ное программирование (практикум). – Спб.: Пи-тер, 2004.
4. Аляев Ю.А., Козлов О.А. Программирование. Pascal, C++, Visual Basic. М.: Финансы и стати-стика, 2004.
5. Гуденко Д., Петроченко Д. Сборник задач по программированию. – Спб.: Питер, 2003.
6. Культин Н. С/С++ в задачах и примерах.. БХВ – Петербург, 2004.
7. Фридман А., Кландер Л. И др. С/С++. Алгоритмы и примеры. М. Бином, 2003.