Информатика и технология программирования


           

либо причинам нежелателен или невозможен


Если такой алгоритм по каким- либо причинам нежелателен или невозможен (например, для циклического списка или графа), то можно поступить следующим образом:


-разместить в файле все переменные структуры данных и запомнить их адреса в файле;


-сформировать значения файловых указателей в переменных структуры данных, расположенных в памяти;


-"обновить" значения переменных структуры данных в файле, то есть переписать их из памяти по тем же файловым адресам.

Проиллюстрируем оба варианта на примере сохранения дерева в файле. В первом случае дерево записывается в файл "потомками вперед", причем в режиме последовательного доступа без позиционирования. Фактически получается файл записей фиксированной длины, в котором записи связаны между собой и образуют дерево с головной вершиной в конце файла:



//------------------------------------------------------bk59-03.cpp

&#35include &#60stdio.h&#62
&#35include &#60alloc.h&#62
struct ftree
{
int val;
struct ftree *left,*right; // Указатели в памяти

long fleft,fright; // Указатели в файле

};

&#35define FNULL -1L
&#35define TSZ sizeof(ftree)

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

//

long PutTree(ftree *p, FILE *fd)
{
long pos;
if (p == NULL) return(FNULL);
p -&#62fleft = PutTree(p-&#62left,fd);
p -&#62fright = PutTree(p-&#62right,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(&#38pos0, sizeof(long), 1, fd);
pos0 = PutTree(p,fd);
fseek(fd, 0L, SEEK_SET); // Обновить указатель

fwrite( (void*)&#38pos0, sizeof(long), 1, fd);
return;
}

Во втором случае рекурсивная функция записи сначала размещает текущую вершину и запоминает ее адрес в файле.

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий