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


Шаг Файловая коллекция однотипных элементов


До сих пор мы рассматривали только отдельные объекты и их размещение в файле, но не оговаривали общей структуры файла и принципов размещения в нем всех объектов:



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



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

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


//------------------------------------------------------bk8-06.cpp


//------Класс - файловая коллекция


class FCollect : FArray
{
TElem *Prototype;
//----- Объект производного класса, тип которого соответст-


// вует типу объектов, с которыми работает программа и ко-


// торые должны храниться в файле.


BinFile F;
FPTR head;
//----- Указатель в файле на массив файловых указателей



public:
BOOL Create(char *,int);
BOOL Open(char *);
void Close();
BOOL Expand();
TElem *operator[](int);
int Insert(TElem *,int=-1);
BOOL Delete(int);
void Sort();
FCollect(TElem *);
~FCollect() {}
};


//---------------------------------------------------------


void FCollect::Close()
{
FArray::Close();
F.close();
}


BOOL FCollect::Expand()
{
FPTR *pnew;
if (size != NElem()+1)
return( FArray::Update(F,head,0) !=FNULL);
if ((pnew = new FPTR[size*2]) ==NULL) return(0);
for (int n=0; n &#60 size; n++) pnew[n] = ptr[n];
delete ptr;
ptr = pnew;
size *= 2;
if ((head = FArray::Update(F,head,1)) ==FNULL)
return(0);
F.seekg(sizeof(int));



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