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

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

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

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

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

Служебная информация о списке, располагаемая внутри массива указателей, представлена двумя элементами - полями:

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

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

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

bool initFile (char *FileName, TFile &f)

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

{

/*Открытие файла*/

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

{

/*если произошла ошибка открытия файла, то выход*/

return false;

}

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

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

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

fwrite (&start_hole, sizeof(int),1,f);

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

int start_list = 8 + 4*2; // позиция 1-го байта перечня указателей

на элементы списка в массиве указателей на элементы списка

/*файловый курсор на 4-м байте файла*/

fwrite (&start_list, sizeof(int), 1, f);

/*Формируется поле размера массива указателей*/

int size_ar = SizeArH; /*начальный размер массива*/

/*файловый курсор на 8-м байте файла*/

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

/*Формируется поле количества элементов списка*/

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

/*файловый курсор на 12-м байте файла*/

fwrite (&cnt, sizeof(int), 1, f);

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

TElmArrPtrFile ptrEl=-1; /*начальное значение элементов массива указателей*/

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

{

fwrite(&ptrEl, sizeof(TElmArrPtrFile),1,f);

}

fclose(f);

return true;

} /*initFile*/

2.1.21Процедура открытия файла со списком

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

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

{

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

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

{

return false;

}

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

fseek (f, 0, SEEK_SET);

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

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

fseek (f, 4, SEEK_SET);

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

return true;

} /* OpenFileList */