Форматированный ввод-вывод данных
Это частный случай строкового ввода-вывода. При вводе выполняется заданное форматной строкой преобразование байтов строки и присваивание полученных значений специфицированным переменным. При выводе выполняется обратное преобразование значений и передача их символьного представления в поток вывода. Функции форматированного ввода-вывода используют переменное количество аргументов. Функции стандартного и файлового вида работают аналогично, но последние должны задать рабочий файл.
Функция форматированного ввода вида
fscanf ( fp ,”форматная строка“, &аргумент,…)
выполняет ввод (чтение) данных из открытого файла fp по адресу аргумента. Символы форматной строки задают способ преобразования вводимых байтов. Отдельное преобразуемое поле начинается с текущей позиции в буфере потока. Завершением поля считается символ пробела или перевода строки. Форматная строка обрабатывается слева направо.
Функция форматированного вывода вида
fprintf ( fp, ”форматная строка”, аргумент,…)
выполняет вывод (запись) в открытый файл fp значение аргумента.
Символы форматной строки задают способ, в соответствии с которым выполняется преобразование чисел в последовательность символов. Полученная последовательность символов помещается в специфицированный поток. Все остальные символы строки формата передаются в поток без преобразования.
Пример. Требуется записать в файл (kvadrnum.dat) возведенные в квадрат целые числа, затем прочитать их из файла и вывести на экран. Демонстрируется использование функций файлового и стандартного форматированного ввода-вывода текстовых файлов на диске. При вводе исходных данных осуществляется их проверка.
Программа.
# include <stdio.h>
# include<conio.h>
int main ()
{ char buffer [81], /* буфер для приема строки */
*ptr=”Массив_чисел_типа_integer_в_файле:”; /*заголовок массива*/
FILE *fp; /* указатель файла */
int first , last, /*начальное и конечное числа */
i, j, /* переменные для циклов */
numbers [256]; /* массив чисел */
clrscr (); /* очистка экрана */
while (1) /* бесконечный цикл ввода */
{ print (“Введите начальное число (больше нуля):”);
scanf (“%d”, &first);
printf (“Введите конечное число (0..255):”);
scanf (“%d”, &last);
/* Проверка корректности ввода чисел: */
if (first >= 0 && last >= first && last < 256)
break; /* выход из цикла ввода */
else printf (“\a\n”); /* сигнал об ошибке */
}
/* Открытие файла: */
if ((fp = fopen (“C:\\TC\\MYFILES\\kvadrnum.dat”,”wt”)) == NULL)
{ puts (“Ошибка открытия файла “);
return 253; /* аварийное завершение программы */
}
puts ( “Открыт файл (KVADRNUM.DAT) “
” для ввода и вывода квадратов целых чисел.”);
fprintf (fp , “%s\n”, ptr ); /* запись заголовка массива в файл */
for ( i = first ;i <= last; i++) /* цикл по числам */
fprintf (fp,”%d\n”, i*i); /* запись квадрата числа в файл */
i = last – first+1; /* количество чисел в файле */
printf (“Записано чисел в файле: %2d\n”, i);
rewind (fp); /* установка указателя на начало файла */
fscanf (fp ,”%s”, buffer); /*чтение заголовка массива из файла в буфер*/
puts (buffer); /* вывод заголовка файла на экран */
for (j=0; i– –; j++) /* цикл чтения чисел из файла и вывод */
{ fscanf (fp, “%d”, &numbers [j]); /* ввод числа из файла fp в массив */
printf (“%3d-е число =%5d;\n”, j+1,numbers [j]); /* вывод на экран */
}
printf (“Прочитано из файла: %2d чисел.”, j);
fclose (fp); /* закрытие файла */
puts(“\n Нажмите на любую клавишу …”);
getch (); /* задержка экрана результатов */
return 0; /*нормальное окончание программы*/
}
Результаты программы:
Введите начальное число (больше 0): 3
Введите конечное число (0..255): 7
Открыт файл (KVADRNUM.DAT) для ввода и вывода квадратов целых чисел.
Записано чисел в файле: 5
Массив_чисел_типа_integer_в_файле:
1-е число = 9
2-е число = 16
3-е число = 25
4-е число = 36;
5-е число = 49;
Прочитано из файла: 5 чисел.
Нажмите любую клавишу…
Пример. Требуется записать данные (целое число, символ, строку) в текстовый файл exemfile.txt, прочесть их из файла и вывести на экран.
Демонстрируется использование основных функций работы с файлами в текстовом режиме.
Программа.
#include <stdio.h> /* для команд ввода-вывода */
#include <conio.h> /* для функций clrscr, getch */
int main()
{ int n; /* переменная для целого числа */
char str[50], str1[50], ch; /* символьные массивы и переменная */
FILE *fp; /* файловая переменная-указатель */
clrscr (); /* очистка экрана */
/* Открываем текстовый файл для записи и чтения и заполняем его: */
if ((fp=fopen (“C:\\TC\\MYFILES\\exmfile.txt”, “w+”))==NULL
{ perror (“Ошибка открытия файла”);
return 1; /* аварийное завершение программы */
}
puts (“Запись разнотипных данных в текстовый файл:”);
puts (“Введите целое число:”);
scanf (“%d”, &n);
fprintf (fp, “%d”, n); /* запись целого числа в файл */
fflush (stdin); /* очистка буфера ввода */
puts (“Введите символ:”);
ch=getchar();
putc (ch, fp); /* запись символа в файл */
fflush (stdin); /* очистка буфера ввода */
puts (“Введите строку:”);
gets (str);
fputs (str, fp); /* запись строки в файл */
rewind (fp); /* установка маркера на начало файла */
puts (“\nВывод данных из файла на экран:”);
fscanf (fp, “%d”, &n); /* чтение целого числа из файла */
printf (“n=%d\n”, n); /* вывод целого числа на экран */
ch=getc (fp); /* чтение символа из файла */
printf (“%c\n”,ch); /* вывод символа на экран */
fgets (str1, 50, fp); /* чтение строки из файла */
puts (str1); /* вывод строки на экран */
fclose (fp); /* закрытие файла */
puts (“Нажмите на любую клавишу…”);
getch(); /* задержка экрана результатов */
return 0; /* нормальное завершение программы */
}
Результаты программы:
Запись разнотипных данных в текстовый файл:
Введите целое число:
Введите символ:
W
Введите строку:
Привет, программист!
Вывод данных из файла на экран:
n=345
W
Привет, программист!
Нажмите на любую клавишу…