Шаг Файловая коллекция однотипных элементов
До сих пор мы рассматривали только отдельные объекты и их размещение в файле, но не оговаривали общей структуры файла и принципов размещения в нем всех объектов:
-размерность всех структур данных в файле должна быть переменной и увеличиваться по мере заполнения файла;
-все структуры данных файла должны быть достижимы через его начало, там же должны располагаться параметры, определяющие размерность данных, идентификаторы типов содержащейся информации и т.д.. Всем этим условиям удовлетворяет приведенная ниже схема размещения данных в файле.
При работе с файлом через объект класса "файловая коллекция" все управляющие структуры данных из файла читаются в соответствующие элементы данных объекта, при изменении объектов коллекции или ее состава в памяти одновременно производятся соответствующие изменения в файле. Ввиду относительной простоты программы объекты коллекции не сохраняются в памяти, связанной с коллекцией (не кэшируются), а передаются вызывающим программам.
//------------------------------------------------------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 < 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));