Int year;
Int pages;
};
Main()
{
Book b[100]; // выделение памяти под массив структур
Int i, n;
FILE *fp;
fp = fopen("books.dat", "rb"); // читаем 100 структур
n = fread(&b[0], sizeof(Book), 100, fp); // прочитали n шт.
Fclose ( fp );
for ( i = 0; i < n; i ++ ) // обрабатываем все, что прочитали
b[i].year = 2009;
fp = fopen("books.dat", "wb"); // записываем n шт.
Fwrite ( b, sizeof(Book), n, fp );
Fclose ( fp );
}
Динамическое выделение памяти
Предположим, что надо создать массив структур, размер которого выясняется только во
время работы программы. Для этого надо
1) объявить переменную типа указатель на нужный тип данных;
2) выделить память с помощью оператора newи запомнить адрес выделенного блока;
3) использовать новую область как обычный массив.
Book *B;
Int n;
printf("Сколько у вас книг? ");
scanf ( "%d", &n ); // вводим размер массива
B = new Book[n]; // выделяем память
// здесь работаем с массивом B, как обычно
delete B; // освобождаем память
Иногда требуется выделить в памяти одну структуру. При этом мы получаем ее адрес, который записываем в переменную-указатель. Как получить доступ к полю структуры?
Один из вариантов – «разыменовать» указатель, то есть обратиться к той структуре, на
которую он указывает. Если p– указатель на структуру типа Book, то обратиться к ее полюauthorможно как (*p).author. Эта запись означает «мне нужно поле authorтой структуры, на которую указывает указатель p».
В языке Си существует и другой способ обратиться к полю структуры: можно написать и
p->author, что значит то же самое, что и (*p).author, но более понятно. В следующем
примере динамически выделяется память на 1 структуру, ее поля считываются с клавиатуры, изатем структура записывается в конец текстового файла books.txt.
Book *p;
FILE *fp;
p = new Book; // выделить память на 1 структуру
printf("Автор "); // ввод полей через указатель
gets ( p->author );
printf("Названиекниги ");
gets ( p->title );
printf("Год издания, кол-во страниц ");
scanf("%d%d", &p->year, &p->pages);
fp = fopen("books.txt", "a"); // дописать в конец файла
fprintf("%s\n%s\n%d %d\n", // обращение через указатель
p->author, p->title, p->year, p->pages);
Дата добавления: 2015-10-05; просмотров: 624;