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


           

В нашем случае это происходит


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





//------------------------------------------------------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; // Возвратить указатель на строку

}


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





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