Массив файловых указателей
Основой коллекции является массив указателей. Для файловой коллекции необходим аналогичный массив файловых указателей на элементы коллекции. Только тогда появляется возможность работать с элементами коллекции в произвольном порядке и загружать их по отдельности. Определим специальный класс -массив файловых указателей.
//------------------------------------------------------bk8-05.cpp
//------Класс - массив файловых указателей
class FArray : TElem
{
protected: int size;
//----- Текущая размерность динамического массива в памяти
// и соответствующей записи в файле
protected: FPTR *ptr;
//----- Массив файловых указателей - является динамическим
// массивом переменных типа FPTR с ограничителем FNULL
public:
//----- Стандартные унаследованные и переопределенные
// функции работы с файлом из класса TElem
BOOL FromString(char *) { return(0);}
char *ToString() { return(NULL);}
int Compare(TElem *) { return(0);}
BOOL IsValid() { return(0);}
TElem *Copy() { return(NULL);}
int IDENT() { return(-1);}
char *Name() { return("");}
int FSize();
FPTR Update(BinFile&, FPTR=FNULL,int=1);
FPTR Append(BinFile&);
BOOL Load(BinFile&, FPTR=FNULL);
void Close();
//----------------------------------------------------------
int NElem();
FArray();
~FArray();
};
//----- Массив указателей в файле представляет собой запись
// переменной длины, для работы с ней используются соответ-
// ствующие функции класса BinFile
int FArray::FSize()
{ return(size * sizeof(FPTR)); }
int FArray::NElem()
{
if (ptr==NULL) return(0);
for (int n=0; ptr[n]!=FNULL; n++);
return(n);
}
FPTR FArray::Update(BinFile& F, FPTR pos, int mode)
{
if (ptr == NULL) return(FNULL);
if (pos !=FNULL)
{ F.seekg(pos); if (!F.good()) return(FNULL); }
return (F.VSZUpdate((void *)ptr,FArray::FSize(),mode));
}
FPTR FArray::Append(BinFile& F)
{
if (ptr==NULL) return(FNULL);
return( F.VSZAppend((void *)ptr, FArray::FSize()));
}
BOOL FArray::Load(BinFile& F, FPTR pos)
{
if (ptr !=NULL) delete ptr;
if (pos != FNULL)
{ F.seekg(pos); if (!F.good()) return(0); }
if ((ptr = (long *)F.VSZLoad(size))==NULL) return(0);
size = size / sizeof(FPTR);
return(1);
}
FArray::FArray() { ptr = NULL; }
void FArray::Close()
{
if (ptr!=NULL) delete ptr;
ptr = NULL;
}
FArray::~FArray() { Close(); }