Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 6 С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆
    1. Описание типов для списка, размещаемого в двоичном файле

Как отмечалось выше, при реализации списка в файле тип данных – указатель не используется. Адрес следующего элемента списка – это номер записи файла, в которой он записан, то есть – целое число.

Для реализации списка в файле нет необходимости в глобальной переменной Start, содержащей адрес первого элемента списка, так как его всегда можно взять из заголовочной записи в файле.

Файловая переменная, соответствующая файлу со списком, должна быть глобальной.

Пример описания типов для списка в файле приведен на рисунке 6.2.

typedef

struct SStudF{

char fam[30]; /* поле для ФИО студента */

int bal; /* поле для бала студента */

int Next; /* дополнительное поле-указатель,

которое будет содержать адрес

следующего элемента списка. Для

списка в файле это тип данных int*/

} TSStudF;

FILE *fLst;

Рисунок 6.2 – Описание типов и объявление переменных для реализации списка в двоичном файле на языке С++

    1. Основные процедуры для реализации списка в двоичном файле

Для реализации списка в файле необходимо обеспечить выполнение следующих операций:

  1. Открытие файла для списка;

  2. Инициализация списка в файле;

  3. Вывод списка на экран;

  4. Поиск физического места для размещения нового элемента в файле (ее назначение подобно назначению процедуры New для кучи);

  5. Освобождение физического места в файле после удаления элемента из списка (ее назначение подобно назначению процедуры Delete для кучи);

  6. Добавление нового элемента в список:

  7. Удаление элемента из списка;

  8. Поиск элемента в списке по ключу;

  9. Удаление всего списка.

      1. Открытие файла для списка

Процедура открытия или создания файла для списка получает имя файла, переменную ("указатель") начала списка и возвращает файловую переменную. В функции выполняется проверка существования файла с заданным именем. Если файл со списком не существует, то выполняется создание нового файла с заданным именем и производится вызов процедуры инициализации файла, описанной ниже (см. п. 6.3.2). Если файл существует, то он открывается для чтения и записи.

Процедура открытия или создания файла для списка представлена на рисунке 6.3.

//Функция открытия файла,содержащего список

//Параметры: имя файла fileName и переменная начала списка St

//Функция возвращает файловую переменную f

FILE* openFile(char fileName[15], int &St)

{ FILE* f;

TSStudF stud;

if (!QFile::exists(fileName)) { //Проверяем: файл НЕ существует?

f=fopen(fileName,"w+b"); //Файл не существует - будет создан

initFile(f); //и проинициализирован

St=-1; //Также инициализируем переменную начала списка

} else {//Файл существует. открываем для чтения и записи

f=fopen(fileName,"r+b");

//Инициализируем переменную начала списка

fseek(f,sizeof(TSStudF),SEEK_SET); //Заголовок списка - это вторая запись файла, поэтому смещение ее в файле sizeof(TSStudF)

fread(&stud,sizeof(TSStudF),1,f); //Читаем заголок списка из файла

St=stud.Next;

}//if

return f;

}

Рисунок 6.3 – Процедура открытия файла