Массив указателей является наиболее простой и в то же время эффективной структурой данных для организации произвольного доступа к хранимым элементам. Рассмотрим, как будет выглядеть в файле структура данных, содержащая строки - записи переменной длины и массив указателей на них.
В начале файла расположена целая переменная - 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*)&n,sizeof(int),1,fd); // файловых указателей в памяти
fwrite((void*)pp,sizeof(long),n,fd); // Записать в файл размерность
for (i=0; i<n; i++) // массива файловых указателей
{ // и сам массив (занять место)
pp[i]=ftell(fd); // Записать строку в файл в виде
int sz=strlen(p[i])+1; // записи переменной длины и
fwrite((void*)&sz,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);
}
Функция загрузки структуры данных иллюстрирует тот факт, что при переменной размерности она должна полностью создаваться в динамический памяти.