Помимо основных функций ввода/вывода, система буферизированного ввода/вывода содержит fprintf() и fscanf(). Данные функции ведут себя так же, как и printf() и scanf(), за тем исключением, что работают с дисковыми файлами. Они имеют следующие прототипы:
int fprintf(FILE *fp, const char *форматная_строка, ...);
int fscanf(FILE *fp, const char * форматная_строка, ...);
где fp - это указатель на файл, возвращаемый fopen(). Если не принимать во внимание, что они перенаправляют вывод в файл, то можно считать, что работа данных функций полностью идентична printf() и scanf() соответственно.
Для демонстрации использования данных функций следующая программа содержит в файле простой телефонный справочник. Можно ввести имена и номера или узнать, какой номер соответствует определенному имени.
/* простой телефонный справочник */
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void add_num(void), lookup(void);
char menu(void);
int main(void)
{
char choice;
do {
choice = menu();
switch(choice) {
case 'a': add_num();
break;
case '1': lookup();
break;
}
} while (choice!='q');
return 0;
}
/* вывод меню и получение запроса */
char menu(void)
{
char ch;
do {
printf("(A)dd, (L)ookup, or (Q)uit: ");
ch = tolower(getche());
printf("\n");
} while(ch != 'q' && ch != 'a' && ch != '1');
return ch;
}
/* добавление имени и номера в справочник */
void add_num(void)
{
FILE *fp;
char name[80];
int a_code, exchg, num;
/* открытие для присоединения */
if((fp=fopen("phone", "a")) == NULL) {
printf("Cannot open directory file.");
exit(1);
}
printf("Enter name and number: ");
fscanf(stdin, "%s%d%d%d", name, &a_code, &exchg, &num);
fscanf(stdin, "%*c"); /* удаление возврата каретки из потока ввода */
/* запись в файл */
fprintf(fp,"%s %d %d %d\n", name, a_code, exchg, num);
fclose(fp);
}
/* поиск числа по имени */
void lookup(void)
{
FILE *fp;
char name[80], name2[80];
int a_code, exchg, num;
/* открытие для чтения */
if((fp=fopen ("phone","r")) == NULL) {
printf("Cannot open directory file.");
exit(1);
}
printf("name? ");
gets(name);
/* поиск числа */
while(!feof(fp)) {
fscanf(fp,"%s%d%d%d", name2, &a_code, &exchg, &num);
if (!strcmp(name, name2)) {
printf("%s: (%d) %d-%d\n",name, a_code, exchg, num);
break;
}
}
fclose(fp);
}
Введем и запустим данную программу. После введения нескольких имен и чисел просмотрим файл phone. Как и следовало ожидать, он будет иметь вид как и обычная информация, посылаемая на экран с помощью функции printf().
ЗАМЕТКА: Хотя fprintf() u fscanf() часто являются наиболее простым способом записи и чтения данных из файла, они далеко не всегда являются наиболее эффективным решением. Поскольку отформатированные ASCII-данные сохраняются так же, как они выглядят на экране (а не в двоичном представлении), появляются дополнительные расходы при каждом вызове. Если скорость работы программы или размер создаваемых файлов играют важную роль, то, возможно, лучше использовать fread() и fwrite() |