Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Чтение форматированных файлов

Ввод информации из форматированного файла осуществляется с использованием функции fscanf(). Она работает аналогично функции scanf() за исключением того, что fscanf() осуществляет ввод данных не с клавиатуры, а из

файла. К несчастью, использование fscanf() имеет те же ограничения, что и применение scanf(). Эта функция не может читать строки, содержащие пробелы, и если данные во входном потоке не будут соответствовать указателям в строке формата, она вернет ошибочные значения.

В Листинге 12.4 приводится текст программы, которая читает данные из форматированного файла, содержащего сведения об инвентарной описи. Заметьте, что цикл while повторяется до тех пор, пока функция fscanf() не возвратит значение EOF, которое будет свидетельствовать о достижении конца файла.

Листинг 12.4. Чтение форматированного текста из файла.

/*fscanf.c*/

#include "stdio.h"

main()

{

FILE *fp;

char name[20];

int quantity;

float cost;

if ((fp = fopen("MYFILE", "r")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

while (fscanf(fp, "%s%f%d", name, &cost, &quantity) != EOF)

{

printf("Наименование товара: %s\n", name);

printf("Цена: %.2f\n", cost);

printf("Количество единиц: %d\n", quantity);

}

fclose(fp);

}

Работа со структурами

Одним из способов преодолеть ограничения функции scanf() является объединение элементов данных в структуру с тем, чтобы впоследствии осуществлять ввод и вывод структур целиком. Структуру можно записать на диск с помощью функции fwrite() и прочитать из файла с помощью функции fread().

Синтаксис функции fwrite() такой:

fwrite(&structure_variable, structure_size,

number_of_structures, file_pointer);

На первый взгляд, эта инструкция выглядит несколько устрашающей, но на самом деле использовать ее очень легко:

  • &structure_variable — имя структурной переменной с оператором получения адреса, сообщающим компилятору стартовый адрес информации, которую мы хотим записать на диск;

  • structure_size — это количество символов в структуре; не обязательно подсчитывать его самому, для этого можно использовать библиотечную функцию sizeof(), записанную следующим образом:

sizeof(structure_variable)

которая автоматически определит размер указанной структуры;

  • number_of_structures — это целое число, определяющее количество структур, которые мы хотим записать в один прием; здесь всегда следует указывать число 1, если только вы не собираетесь создать массив структур и записать его одним большим блоком;

  • file_pointer — указатель на файл.

В качестве примера предположим, что вы хотите записать на диск сведения о своей коллекции компакт-дисков. Используя структуру CD, которую мы подробно разбирали в главе 11, пишем инструкцию:

fwrite(&disc, sizeof(disc), 1, fp);

Рис. 12.5. Синтаксис функции fwrite() в инструкции записи структуры CD

Выполнение этой инструкции иллюстрирует рис.12.5.

Текст программы, которая вводит данные в структуру CD, а затем сохраняет ее на диске, приведен в Листинге12.5. Для ввода имени создаваемого файла используется функция gets(). Переменная, в которой хранится имя файла, используется функцией fopen() для того, чтобы открыть файл.

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

Листинг 12.5. Запись структуры CD.

/*fwrite.c*/

#include "stdio.h"

main()

{

FILE *fp;

struct CD

{

char name[20];

char description[40];

char category[12];

float cost;

int number;

} disc;

char filename[25];

printf("Введите имя файла, который вы желаете создать: ");

gets(filename);

if ((fp = fopen(filename, "w")) == NULL)

{

printf("Невозможно открыть файл %s\n", filename);

exit();

}

puts("Введите сведения о диске\n");

printf("Введите название диска: ");

gets(disc.name);

while (strlen(disc.name) > 0)

{

printf("Введите описание: ");

gets(disc.description);

printf("Введите категорию: ");

gets(disc.category);

printf("Введите цену: ");

scanf("%f", &disc.cost);

printf("Введите номер ячейки: ");

scanf("%d", &disc.number);

fwrite(&disc, sizeof(disc), 1, fp);

printf("Введите название: ");

gets(disc.name);

}

fclose(fp);

}