Форматный ввод данных осуществляется с помощью функцийscanf, fscanf,sscanfиcscanf. Все названные функции вводят значения, интерпретируют их в соответствии с "типом форматов, преобразуют их'в соответствии с типом аргументов и присваивают введенные значения переменным. Правила использования форматов и аргументов этих функций идентичны. Рассмотрим их более детально.
Прототип функции scanf:
int scanf(char * format [ , arg...]);
С помощью функцииscanfосуществляется ввод данных из стандартного вводного потокаstdin(с клавиатуры) в переменные, адреса которых задаются аргументами (arg). Функция имеет переменное количество параметров. Значение первого параметра format определяет адрес строки, которая управляет интерпретацией элементов ввода. Последующие аргументы представляют собой список адресов, переменных, значения которых должны быть введены в соответствии с форматами параметра format. Каждый последующий аргумент должен быть указателем на переменную типа, совместимого с типом, определенным очередным форматом в параметре format. Строка format обрабатывается слева направо: первому формату соответствует первый аргумент, второму - второй и т. д.
Прототип функцииfscanf:
int fscanf (File * stream, char * format [ , arg ... ], );
где stream - указатель для файла, из которого производится ввод.
Функция читает данные из файла, связанного с указателемstream.
Прототип функцииsscanf:
int sscanf (char * string, char * format [ , arg ... ], );
где string - указатель на строку, из которой производится ввод, Функцияsscanfчитает данные из строки string.
Прототип функцииcscanf:
int cscanf (char * format [ , arg ... ], );
Функцияcscanfчитает данные, введенные с консоли (с клавиатуры). Возвращаемое значение функций типаscanf.
- количество успешно введенных и присвоенных значений;
- значение0, если ввод неудачен, нет значений, которые введены и присвоены переменным;
- значениеEОF, если чтение производится по концу файла.
Все функции типаscanfвводят последовательно значения из полей входного потока, интерпретируя их в соответствии с их форматом. Первое введенное значение интерпретируется в соответствии с первым форматом строки format, преобразуется в форму хранения переменной аргумента и заносится по адресу первого аргумента. Значение из следующего поля интерпретируется в соответствии со вторым форматом и т. д. до конца строки format.
Если количество форматов в строке scanf c больше, чем аргументов - указателей вводимых значений:
- при вводе данных с клавиатуры система останавливается и ожидает ввода данных для лишних форматов;
- при вводе из файла с помощью fscanf - результат не определен. . .
Если аргументов в списке больше, чем форматов в строке format, лишние аргументы игнорируются, не получают новых значений.
... Соответствие типов форматов типам переменных аргументов не контролируется транслятором. То есть можно определить формат “%f” для переменной типаint. Но при выполнении программы это несоответствие приведет к аварийному завершению программы.
Если при вводе очередных значений из входного файла в нем встретился символ конца строки (\n), а форматы и элементы списка аргументов не исчерпаны, происходит автоматический переход на следующую строку входного потока и ввод продолжается со следующей строки. То есть при переходе к следующему полю функцияfscanfможет "перешагивать" через границы строк. Таким образом, если с помощьюfscanfвводится последовательно ряд значений из ряда строк текстового файла, длины которых не кратны количеству позиций, вводимых за одно выполнение функцииfscanf, то ввод очередных значений начинается с позиции, на которой закончен предыдущий ввод.