либо причинам нежелателен или невозможен
Если такой алгоритм по каким- либо причинам нежелателен или невозможен (например, для циклического списка или графа), то можно поступить следующим образом:
-разместить в файле все переменные структуры данных и запомнить их адреса в файле;
-сформировать значения файловых указателей в переменных структуры данных, расположенных в памяти;
-"обновить" значения переменных структуры данных в файле, то есть переписать их из памяти по тем же файловым адресам.
Проиллюстрируем оба варианта на примере сохранения дерева в файле. В первом случае дерево записывается в файл "потомками вперед", причем в режиме последовательного доступа без позиционирования. Фактически получается файл записей фиксированной длины, в котором записи связаны между собой и образуют дерево с головной вершиной в конце файла:
//------------------------------------------------------bk59-03.cpp
#include <stdio.h>
#include <alloc.h>
struct ftree
{
int val;
struct ftree *left,*right; // Указатели в памяти
long fleft,fright; // Указатели в файле
};
#define FNULL -1L
#define TSZ sizeof(ftree)
//------ Функция записи возвращает адрес вершины в файле
//
long PutTree(ftree *p, FILE *fd)
{
long pos;
if (p == NULL) return(FNULL);
p ->fleft = PutTree(p->left,fd);
p ->fright = PutTree(p->right,fd);
pos = ftell(fd);
fwrite( (void*)p, TSZ, 1, fd);
return(pos);
}
//------ Функция формирует файл записей фиксированной длины
// В начало файла записывается указатель на головную
// вершину дерева
void SaveTree(ftree *p, char *name)
{
long pos0; // Указатель на головную запись
FILE *fd;
if ((fd=fopen(name,"wb")) ==NULL) return;
// Резервировать место под указатель
fwrite(&pos0, sizeof(long), 1, fd);
pos0 = PutTree(p,fd);
fseek(fd, 0L, SEEK_SET); // Обновить указатель
fwrite( (void*)&pos0, sizeof(long), 1, fd);
return;
}
Во втором случае рекурсивная функция записи сначала размещает текущую вершину и запоминает ее адрес в файле.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий