- •Лабораторная работа № 6 Реализация списка в двоичном файле
- •Лабораторная работа № 6 Реализация линейного списка в двоичном файле.
- •Теоретические сведения
- •Описание типов для списка, размещаемого в двоичном файле
- •Основные процедуры для реализации списка в двоичном файле
- •Вывод списка на экран;
- •Открытие файла для списка
- •1.1.3Поиск физического места для размещения нового элемента в файле
- •1.1.1Инициализация списка
- •1.1.2Вывод списка на экран
- •1.1.4Освобождение физического места в файле после удаления элемента из списка
- •1.1.5Добавление нового элемента в отсортированный список
- •1.1.6Поиск элемента в отсортированном списке
- •1.1.7Удаление элемента из отсортированного списка
- •1.1.12Реализации основного модуля проекта
- •Задания для выполнения проекта
- •Тестирование проекта
- •Содержание отчета
- •Контрольные вопросы и задания
Описание типов для списка, размещаемого в двоичном файле
Как отмечалось выше, при реализации списка в файле тип данных – указатель не используется. Адрес следующего элемента списка – это номер записи файла, в которой он записан, то есть – целое число.
Для реализации списка в файле нет необходимости в глобальной переменной Start, содержащей адрес первого элемента списка, так как его всегда можно взять из заголовочной записи в файле.
Файловая переменная, соответствующая файлу со списком, должна быть глобальной.
Пример описания типов для списка в файле приведен на рисунке 6.2.
typedef struct SStudF{ char fam[30]; /* поле для ФИО студента */ int bal; /* поле для бала студента */ int Next; /* дополнительное поле-указатель, которое будет содержать адрес следующего элемента списка. Для списка в файле это тип данных int*/ } TSStudF;
FILE *fLst; |
Рисунок 6.2 – Описание типов и объявление переменных для реализации списка в двоичном файле на языке С++
Основные процедуры для реализации списка в двоичном файле
Для реализации списка в файле необходимо обеспечить выполнение следующих операций:
Открытие файла для списка;
Инициализация списка в файле;
Вывод списка на экран;
Поиск физического места для размещения нового элемента в файле (ее назначение подобно назначению процедуры New для кучи);
Освобождение физического места в файле после удаления элемента из списка (ее назначение подобно назначению процедуры Delete для кучи);
Добавление нового элемента в список:
Удаление элемента из списка;
Поиск элемента в списке по ключу;
Удаление всего списка.
Открытие файла для списка
Процедура открытия или создания файла для списка получает имя файла, переменную ("указатель") начала списка и возвращает файловую переменную. В функции выполняется проверка существования файла с заданным именем. Если файл со списком не существует, то выполняется создание нового файла с заданным именем и производится вызов процедуры инициализации файла, описанной ниже (см. п. 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 – Процедура открытия файла
