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

Чтение структур

Для того чтобы прочитать структуру целиком, используется функция fread(). Она имеет следующий синтаксис:

fread(&structure_variable, structure_size,

number_of_structures, file_pointer);

За исключением имени функции эта инструкция полностью совпадает с записью функции fwrite(). Программа, в которой из файла считывается структура CD, приведена в Листинге12.6. Для чтения данных используется цикл while:

while (fread(&disc, sizeof(disc), 1, fp) == 1)

Функция fread() возвращает значение, соответствующее количеству успешно прочитанных структур. Так как в аргументе функции мы указали, что читать следует по одной структуре, функция возвращает значение 1. Цикл while будет выполняться до тех пор, пока считывание структур с диска проходит успешно. Если чтение структуры становится невозможным, например потому, что достигнут конец файла, функция возвращает значение 0, и выполнение цикла прекращается.

Листинг 12.6. Чтение структуры CD с диска.

/*fread.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, "r")) == NULL)

{

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

exit();

}

while (fread(&disc, sizeof(disc), 1, fp) == 1)

{

puts(disc.name);

putchar('\n');

puts(disc.description);

putchar('\n');

puts(disc.category);

putchar('\n');

printf("%f", disc.cost);

putchar('\n');

printf("%d", disc.number);

}

fclose(fp);

}

В табл. 12.1 собраны все описанные способы ввода и вывода данных и показаны значения, которые возвращает каждая функция при невозможности продолжения чтения или записи данных.

Таблица 12.1. Функции ввода в файл и вывода из файла.

Чтение в массив

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

В Листинге 12.7 приведен текст программы, осуществляющей чтение информации из файла, содержащего данные о коллекции компакт-дисков, в массив структур CD (предполагается, что их количество не превышает20). Индекс используется для того, чтобы каждая считанная из файла структура сохранялась в отдельном элементе массива disc. После того как очередная структура прочитана и выведена на экран, стоимость очередного диска добавляется к сумме, отражающей общую стоимость коллекции, а значение индекса и счетчика увеличивается за счет выполнения следующих инструкций:

total = total + disc[index].cost;

index++;

count++;

Если бы нас интересовала только информация об общей стоимости и количестве экземпляров коллекции, можно было бы читать данные в структурную переменную, не используя массив, и просто подсчитывать значения переменных total и count. Однако если данные будут считаны в массив, вы сможете произвольным образом обращаться к структурам и печатать любую информацию.

Заметьте, что запрос о вводе имени файла в программе повторяется до тех пор, пока не будет введено имя файла, который действительно можно открыть.

Листинг 12.7. Чтение структуры в массив.

/*rarray.c*/

#include "stdio.h"

main()

{

FILE *fp;

struct CD

{

char name[20];

char description[40];

char category[12];

float cost;

int number;

} disc[20];

int index, count;

float total;

count = 0;

total = 0;

char filename[25];

printf("Введите имя файла данных: ");

gets(filename);

while ((fp = fopen(filename, "r")) == NULL)

{

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

printf("Введите имя файла данных: ");

gets(filename);

}

index = 0;

while (fread(&disc[index], sizeof(disc[index]), 1, fp) == 1)

{

puts(disc[index].name);

putchar('\n');

puts(disc[index].description);

putchar('\n');

puts(disc[index].category);

putchar('\n');

printf("%f", disc[index].cost);

putchar('\n');

printf("%d", disc[index].number);

total = total + disc[index].cost;

index++;

count++;

}

fclose(fp);

printf("Общая стоимость коллекции составляет %.2f\n", total);

printf("Коллекция содержит %.d дисков\n", count);

}

Замечания по Си++

Компиляторы Си++ позволяют читать из файла и записывать в файл данные, используя потоки (ifstream и ofstream), которые открываются с помощью операторов << и >>. Синтаксис чтения из файла:

file_pointer >> variable;

Синтаксис записи в файл:

file_pointer << variable;