Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
8
Добавлен:
12.11.2019
Размер:
1.67 Mб
Скачать
    1. Указатели на структуры

      1. Объявление указателя на структуру

Указатели на структуру объявляются путем помещения оператора * перед именем структурной переменной. Например, предполагая, что ранее была определена структура addr, следующая строка объявляет addr_ptr как указатель на данные этого типа:

struct addr *addr_ptr ;

      1. Использование указателей на структуру

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент:

struct bal {

float balance;

char name[80];

} person;

struct bal p; /* объявление указателя на структуру */

тогда

p = &person;

помещает адрес структуры person в указатель р.

Для доступа к элементам структуры с помощью указателя на структуру следует использовать оператор «стрелка». Оператор «стрелка» (->) образован из знака «минус» и символа «больше». Например, для доступа к элементу balance с помощью указателя р следует написать

p>balance .

    1. Массивы и структуры в структурах

Элемент структуры может быть как простым, так и составным. Простой элемент – это обычный базовый тип данных, например, целочисленный или символьный. Символьный массив, использованный в ainfo, – типичный пример. Другие типы данных являются одномерными или многомерными массивами различных типов данных и структур.

Рассмотрим следующую структуру:

struct x {

int a[10][10]; /* массив целых 10 на 10 */

float b;

} y;

Для обращения к числу с индексами 3, 7 массива а структуры у следует написать:

y.a [3][7];

Когда структура является элементом другой структуры, то она называется вложенной структурой. Например, ниже структура addr вложена в структуру emp:

struct emp {

struct addr address;

float wage;

} worker;

Здесь структура emp имеет два элемента. Первый – это структура типа addr, содержащая адреса служащих. Другой – это wage, содержащий заработную плату служащих. Следующий фрагмент кода присваивает значение 25000 элементу wage структуры worker и значение 97675 полю zip структуры address:

worker.wage = 25000.00;

worker.address.zip = 97675;

В этом примере обращение к элементам каждой структуры происходит снаружи вовнутрь (слева направо).

    1. Функции fread () и fwrite ()

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

size_t fread (void *буфер, size_t число_байт, size_t размер, FILE *fp);

size_t fwrite (const void *буфер, size_t число_байт, size_t размер, FILE *fp);

В случае fread() буфер – это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер – это указатель на информацию, записываемую в файл. Буфер может быть ( а чаще всего это так и есть) простой переменной. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каждый длиной число_байт) будет прочитано или записано. Наконец, fp – это указатель на ранее открытый файл.

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

Если файл был открыт для двоичных данных, то fread() и fwrite() могут читать и писать любой тип данных. Одно из самых наиболее полезных применений fread() и fwrite() – это чтение и запись блоков данных типа массивов и структур. Например, следующий программа записывает содержимое структуры book в файл books.dat, используя один оператор fwrite(). Далее она читает эту структуру, используя один оператор fread(), и выводит значения элементов структуры.

#include <stdio.h>

struct books_type {

char avtor[20];

char nazv[40];

char izd[20];

char year[4];

int num_str;

};

int main (void)

{

register int i;

struct books_type book;

FILE *fp;

/* открытие файла на запись */

if ((fp = fopen(“books.dat”, “wb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return 1;

}

book.avtor = “Шилдт Г.”;

book.nazv = “Программирование на Borland C++”;

book.izd = “ООО «Попурри»”;

book.year = 1998;

book.num_str = 800;

/* запись структуры в файл */

fwrite(book, sizeof book, 1, fp);

fclose(fp);

/* открытие файла для чтения */

if ((fp = fopen(“books.dat”, “rb”)) = = NULL) {

printf(“Не могу открыть файл!”);

return 1;

}

/* чтение структуры из файла */

fread(book, sizeof book, 1, fp);

/* вывод содержимого структуры на экран */

printf(“ Автор книги: %s\n”, book.avtor);

printf(“Название книги: %s\n”, book.nazv);

printf(“ Издательство: %s\n”, book.izd);

printf(“ Год издания: %s\n”, book.year);

printf(“ Число страниц: %s\n”, book.num_str);

fclose(fp);

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]