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

       

Массив файловых указателей


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


//------------------------------------------------------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&#38, FPTR=FNULL,int=1);
FPTR Append(BinFile&#38);
BOOL Load(BinFile&#38, 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&#38 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&#38 F)
{
if (ptr==NULL) return(FNULL);
return( F.VSZAppend((void *)ptr, FArray::FSize()));
}


BOOL FArray::Load(BinFile&#38 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(); }



Содержание раздела