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


Массив указателей в файле - часть 2


В нашем случае это происходит в два этапа. Сначала создается и загружается массив файловых указателей, для которого создается аналогичный массив указателей на строки, но уже в памяти. Затем читаются сами строки.


//------------------------------------------------------bk59-09.cpp


char **load(char *name) // Функция возвращает динамический


{ // массив указателей на строки


FILE *fd;
int i,n;
long *pp;
char **p;
if ((fd=fopen(name,"rb"))==NULL) return;
fread((void*)&#38n,sizeof(int),1,fd); // Прочитать размерность


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


p=new char*[n+1]; // файловых указателей и указателей


fread((void*)pp,sizeof(long),n,fd); // на строки.


// Первый - прочитать из файла


for (i=0; i&#60n; i++)
{
int sz;
fseek(fd,pp[i],SEEK_SET); // Установиться по i-му файловому


fread((void*)&#38sz,sizeof(int),1,fd); // указателю и прочитать запись


p[i]=new char[sz]; // переменной длины - строку


fread((void*)p[i],sz,1,fd);
}
p[n]=NULL;
fclose(fd);
return p;
}

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


//------------------------------------------------------bk59-10.cpp


char *load(char *name, int num) // Возвращается строка =


{ // динамический массив


FILE *fd;
int i,n,sz;
long pp;
char *p;
if ((fd=fopen(name,"rb"))==NULL) return; // Режим чтения двоичного файла


fread((void*)&#38n,sizeof(int),1,fd); // Считать размерность МУ


if (num&#62=n) return NULL; // Нет записи с таким номером


fseek(fd,sizeof(int)+sizeof(long)*num,SEEK_SET); // Установить на указатель


fread((void*)&#38pp,sizeof(long),1,fd); // с номером n и прочитать его


fseek(fd,pp,SEEK_SET); // Установиться на запись


fread((void*)&#38sz,sizeof(int),1,fd); // Прочитать длину записи


p=new char[sz]; // Создать динамический массив


fread((void*)p,sz,1,fd); // Прочитать запись - строку


fclose(fd);
return p; // Возвратить указатель на строку


}




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



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