C_Kurs_Lekt / C_II_семестр / 07-2_Пример работы со структорой
.pdfЛысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение) |
1 |
|
Пример работы со структорой (создание массива структур, за- |
||
|
пись, чтение) |
|
#include <stdio.h> |
|
|
.... |
|
|
#include <stdlib.h> |
|
|
#include <conio.h> |
|
|
// пример ком-да футболистов |
|
|
typedef struct { |
|
|
char |
name[15]; |
|
int |
old; } igra; // тип (структура одного игрока) |
|
/* на основе этого типа создавать массивы варианта 2:
1)"статический", например , igra foot[100] - в команде до 100 игроков
-меньше мороки, но не эф-но исп. память.
2)создание динамического массива под нужное число записей, например, X_man
igra * foot;
if ((foot = (igra *) calloc(X_man, sizeof(igra))) == NULL) {
printf("Ошибка выделения памяти") ; |
exit(2); } |
*/ |
|
int main() { |
|
char *fn="stud.dat"; |
|
return(0); |
|
} |
|
/* ф-я первоначального создания файла на диске( вариант) вводим с клавиатуры одного и пишем его (сразу) в файл */
void Create_File(char *name) { // ....
int i;
igra footman ; // для одного игрока FILE *cfPtr; //указатель на файл
if ((cfPtr = fopen(name, "w")) == NULL) perror(name); else {
while (...) {//ввод данных об одном fgets(footman.name, 15, stdin); scanf(...., &footman.old);
//and write to file, порция -один блок fwrite(&footman, sizeof(igra), 1, cfPtr);
}
fclose(cfPtr);
}
}
Лысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение) |
2 |
// просто печать всего списка игроков void Print_footman(char *name) { FILE *cfPtr;
igra footman; int n;
if ((cfPtr = fopen(name, "r")) == NULL) perror(name); else {
printf(" Список фотболистов\n");
while (1) { //пока возможно - читаем блок с диска в структуру и печатаем
if (fread(&footman, sizeof(igra), 1, cfPtr) == NULL)
break;
printf(" ....",footman.name, footman.old);
}
fclose (cfPtr);
}
// печать с сортировкой
void Print_sort_footman(char *name) { FILE *cfPtr;
igra *footman; igra f_swap; int n, i, j;
char name_swap[15];
if ((cfPtr = fopen(name, "r")) == NULL) perror(name); else {
while(1) { // считаем число байт в файле ( можно число блоковfread)
fgetc(cfPtr); if(feof(cfPtr)) break; j++;
};
n=(j/sizeof(igra)); // делим на размер записи = число
записей в файле. |
|
|
|
printf("размер байт =%d |
размер записи =%d |
кол-во |
за- |
писей = %d\n",j,sizeof(student),n); |
|
|
|
//создаем массив под n игроков |
|
|
|
if ((footman = (igra *) calloc(n, sizeof(igra))) |
== |
||
NULL) { |
|
|
|
printf("Ошибка выделения памяти") ; |
exit(2); } |
||
// считываем всех, т.е. - |
n |
|
|
rewind( cfPtr); // или |
fseek(Tan, SEEK_SET, 0); |
|
if (fread(footman, sizeof(igra), n, cfPtr) == NULL)
break;
fclose (cfPtr);
//сортировка по возрасту(числовое поле) по возрастанию
Лысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение) |
3 |
for (i=0, i < n-1; i++) {
if (footman[i]->old > footman[i+1]->old) { j = footman[i]->old;
footman[i]->old = footman[i+1]->old; footman[i+1]->old = j;
name_swap = ( *footman[i]).name;
( *footman[i]).name = ( * footman[i+1]).name;; ( *footman[i+1].name) = name_swap;
}
}
//сортировка по имени(по строке) по возрастанию for (i=0, i < n-1; i++) {
if ( strcmp (footman[i]->name, footman[i+1]->name) >
0) {
//сравниваем строки, если строка1 > строка2 то ф-я
возвращает
//значение > 0.
//Т.е меняем значения местами, но другим способом
//В начале ф-и определяем структуру для временного хранения - f_swap
//и копирует структуру блоком
memcpy (&f_swap, footman[i], sizeof(igra) ); memcpy (footman[i], footman[i+1], sizeof(igra)
);
memcpy (footman[i+1], &f_swap, sizeof(igra) );
}
printf(" Список фотболистов старше 20 лет\n"); for (i=0, i < n-1; i++)
if( footman[i]->old > 20 )
printf(" ....",footman[i]->name, footman[i]-
>old);
free(footman);
}