Программирование на C и C++

Онлайн справочник программиста на C и C++

fprintf() и fscanf()

Помимо основных функций ввода/вывода, система буферизированного ввода/вывода содержит 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()