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


Массив указателей в файле


Массив указателей является наиболее простой и в то же время эффективной структурой данных для организации произвольного доступа к хранимым элементам. Рассмотрим, как будет выглядеть в файле структура данных, содержащая строки - записи переменной длины и массив указателей на них.

В начале файла расположена целая переменная - n - размерность массива указателей. Затем располагается сам массив файловых указателей - переменных типа long. Каждый указатель является адресом строки в файле, оформленной стандартным образом в виде записи переменной длины. Функция сохранения всей структуры данных в файле использует принцип распределения памяти в файле путем добавления соответствующей переменной в конец файла. При этом массив указателей записывается два раза - в первый раз - для распределения памяти, второй раз - уже после формирования значений указателей (обновление). Заметим, что массиву указателей в файле соответствует аналогичный динамический массив этих же самых указателей в памяти, который сначала формируется, а затем уже записывается в файл.


//------------------------------------------------------bk59-08.cpp


void save(char *p[], char *name)
{
FILE *fd;
int i,n;
long *pp;
if ((fd=fopen(name,"wb"))==NULL) return; // Создать двоичный файл


for (n=0; p[n]!=NULL; n++); // Определить размерность МУ


pp=new long[n]; // Создать динамический массив


fwrite((void*)&#38n,sizeof(int),1,fd); // файловых указателей в памяти


fwrite((void*)pp,sizeof(long),n,fd); // Записать в файл размерность


for (i=0; i&#60n; i++) // массива файловых указателей


{ // и сам массив (занять место)


pp[i]=ftell(fd); // Записать строку в файл в виде


int sz=strlen(p[i])+1; // записи переменной длины и


fwrite((void*)&#38sz,sizeof(int),1,fd); // сохранить адрес в массиве


fwrite((void*)p[i],sz,1,fd); // файловых указателей


}
fseek(fd,sizeof(int),SEEK_SET); // Обновить в файле массив


fwrite((void*)pp,sizeof(long),n,fd); // файловых указателей


fclose(fd);
}

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


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



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