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


Связанные записи в файлеФайловый указатель - часть 2


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



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



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



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

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


//------------------------------------------------------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;
}



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


Начало  Назад  Вперед



Книжный магазин