Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

2.1.5Функция инициализации файла со списком

Эта процедура выполняется только один раз для каждого списка. Она осуществляет формирование в файле содержимого записей №0, №1, №2 и №3, а также начального содержимого SizeArrH+1 элементов массива указателей на элементы списка.

Запись №0 содержит заголовок списка дыр. В качестве признака последнего элемента этого списка используется значение –2 в поле следующая дыра соответствующей дыры. При инициализации файла список дыр пуст. Следовательно, в начальный момент содержимое записи №0 равно –2.

Запись №1 содержит адрес первого байта массива указателей на элементы списка. В случае статических массивов это значение постоянно и равно 16.

Запись №2 содержит размер массива указателей на элементы списка. В начальный момент содержимое этой записи равно SizeArrH.

Запись №3 содержит значение счетчика элементов списка. В начальный момент содержимое этой записи равно 0.

SizeArrH+1 записей, предназначенных для указателей на элементы списка, в начальный момент содержат значение –1, признак "нулевого" значения указателя.

// --------- Инициализация файла ----------//

bool initFile (char *FileName, TFile &f )

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

/*Функция возвращает false если произошла ошибка открытия файла*/

/* FileName – имя файла */

/* f – файловый указатель */

{

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

if (( f = fopen ( FileName, "wb" )) == NULL)

{

/* произошла ошибка открытия файла*/

return false;

}

int Head_Hole; /*указатель на голову списка дыр*/

int StArrPtrElmList; /*позиция 1-го байта массива указателей на

элементы списка */

int CntElmList; /*количество элементов списка*/

TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/

/*Формируется запись файла №0 */

fseek (FList, 0, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 0*/

HeadHole = -2; /*признак пустого списка дыр*/

fwrite(&HeadHole, sizeof(HeadHole), 1, f);

/*Формируется запись файла №1*/

fseek (FList, 4, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 4*/

tArrPtrElmList = 16; /*позиция 1-го байта массива указателей на

элементы списка*/

fwrite ( &StArrPtrElmList , sizeof (StArrPtrElmList), 1, f);

/*Формируется запись файла №2*/

fseek (FList, 8, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 8*/

fwrite ( &SizeArH, sizeof(SizeArH), 1, f );

/*Формируется запись файла №3*/

fseek (FList, 12, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 12)*/

CntElmList = 0; /*начальное количество элементов списка*/

fwrite(&CntElmList , sizeof(CntElmList), 1, f);

/*Формируются начальные значения элементов массива указателей на элементы списка объемом в SizeArrH+1*/

PtrElmLst =- 1;

for ( int k = 0; k <= SizeArH; k++ )

{

fwrite (&PtrElmLst , sizeof (PtrElmLst), 1, f);

}

fclose(f);

return true;

}

2.1.6Функция открытия файла со списком

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

bool OpenFileList(char * FileName, TFile &f, int &StHole, int &Start_list,

int &SizeAr, int &CntElmList)

/* Открывает существующий файл и возвращает false если произошла ошибка открытия файла*/

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

if ((f = fopen(FileName, "r + b")) == NULL)

{

/*произошла ошибка открытия файла*/

return false;

}

/*чтение заголовка списка дыр StHole*/

fseek(f, 0, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 0*/

fread(&StHole, sizeof(StHole), 1, f);

/*чтение адреса первого байта массива указателей на элементы списка Start_list*/

fseek(f, 4, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 4*/

fread(&Start_list, sizeof(Start_list), 1, f);

/*чтение размера массива указателей SizeAr*/

fseek(f, 8, SEEK_SET); /*только для иллюстрации. В действительности

курсор файла уже находится в позиции 8*/

fread(&SizeAr, sizeof(SizeAr), 1, f);

/*чтение счетчика реальных элементов списка CntElmList */

fseek(f, 12, SEEK_SET); /*только для иллюстрации. В действительно-

сти курсор файла уже находится в позиции 12*/

fread(&CntElmList, sizeof(CntElmList), 1, f);

return true;

} /*OpenFileList*/