Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С++ BIKS-12 (Любченко).doc
Скачиваний:
40
Добавлен:
13.04.2015
Размер:
820.74 Кб
Скачать

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

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

int fscanf(FILE *stream, const char *format [, address, ...])

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

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

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

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

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

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

Строка формата состоит из неотображаемых символов (' ',\t,\n), отображаемых символов (все прочие, кроме '%') и спецификаторов формата. Если fscanf встречает неотображаемый символ в форматной строке, она будет считывать, но не сохранять все неотображаемые символы входного потока вплоть до первого отображаемого символа. Если fscanf встречает отображаемый символ в форматной строке, она прочитает, но не сохранит соответствующий символ входного потока.

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

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

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

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

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

размер — N — near, F — far;

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

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

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

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

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

Строка

Примеры

Пример. Вводить строки с клавиатуры и сохранять их в текстовом файле.

char buf[100];

FILE *F;

F = fopen("111.txt", "w");

for (;;) {

gets(buf);

if (strlen(buf) > 40)

break;

fputs(buf, F);

fputs("\n", F);

}

fclose(F);

Замечания.Функцияgetsвводит строки из стандартного входного потокаstdin. При вводе с клавиатуры символ '\n' не попадает в строку. Если вводить при помощи функции

fgets(buf, 100,F), то специального выводаfputs("\n",F) не понадобится.

Пример. Имеется текстовый файл. Напечать его самую длинную строку.

char buf[100], maxbuf[100];

FILE *F;

maxbuf[0] = 0;

F = fopen("111.txt", "r");

while (!feof(F)) {

fgets(buf, 100, F);

if (strlen(buf) > strlen(maxbuf) )

strcpy(maxbuf, buf);

}

fclose(F);

fputs(maxbuf,stdout);

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

puts(maxbuf);

Пример. Вводить целые числа с клавиатуры и сохранять их в двоичном файле.

int buf;

FILE *F;

F = fopen("111.dat", "w");

for (;;) {

scanf("%d", &buf);

if (!buf)

break;

fwrite(&buf, sizeof(int), 1, F);

}

fclose(F);

Замечания. Для ввода целых чисел из входного потока необходимо использовать только форматный ввод (scanf илиfscanf.).

Полученный файл не является текстовым и может быть правильно прочитан только функцией fread.