class OBJECT
{
...
private:
int armor;
char name[20];
};
class CIVIL
: public OBJECT
{
...
private:
int speed; // speed of an unit: number of squares in a second
};
class VECTOR
: public vector<OBJECT*>
{
public:
...
virtual void __fastcall SaveToStream(Classes::TStream* Stream);
virtual void __fastcall LoadFromStream(Classes::TStream* Stream);
};
// Saves container to stream. Writes:
// 1) Number of elements in container
// 2) Signature of the element (Number of letters in its class name, class name)
// 3) Number of letters in a name of an element, its name
// 4) It's armor value
// 5) It's speed value (if requied)
void __fastcall VECTOR::SaveToStream(Classes::TStream* Stream)
{
int Buffer[255];
setmem(Buffer,255,0);
int count = this->size();
int namelen, arm, spd;
char str[20];
OBJECT *obj;
int j=0;
Buffer[j++]=count;
for(int i=0; i<count; i++)
{
Buffer[j++]=i;
obj=this->at(i);
CIVIL *civ=dynamic_cast<CIVIL*> (obj);
if(civ)
{
Buffer[j++]=5;
Buffer[j++]='C';
Buffer[j++]='I';
Buffer[j++]='V';
Buffer[j++]='I';
Buffer[j++]='L';
}
else
{
Buffer[j++]=6;
Buffer[j++]='O';
Buffer[j++]='B';
Buffer[j++]='J';
Buffer[j++]='E';
Buffer[j++]='C';
Buffer[j++]='T';
}
obj->GetName(str);
namelen=strlen(str);
Buffer[j++]=namelen;
for(int k=0; k<namelen; k++)
Buffer[j++]=str[k];
arm=obj->GetArmor();
Buffer[j++]=arm;
if(civ)
{spd=civ->GetSpeed();
Buffer[j++]=spd;
}
Stream->WriteBuffer(Buffer,j);
j=0;
}
}
void __fastcall VECTOR::LoadFromStream(Classes::TStream* Stream)
{
TFileStream *fs;
TMemoryStream *ms;
int *Buffer;
int numbytes;
int count; // number of records
int numrec; // number of current record
int classnamelen; // length of class name (signature)
int namelen; // length of object name
char *classname, name[20]; // class name & object name
int arm, spd; // armor, speed
int j=0; // current byte
int i,k;
OBJECT *obj;
fs=dynamic_cast<TFileStream*> (Stream);
if(fs)
{
numbytes=fs->Size;
Buffer=new int[numbytes];
fs->ReadBuffer(Buffer,numbytes); // ЗДЕСЬ РАБОТАЕТ НЕ КОРРЕКТНО (ИМХО)
}
else
{
ms=dynamic_cast<TMemoryStream*> (Stream);
if(ms)
{
Buffer=new int[numbytes];
ms->ReadBuffer(Buffer,numbytes);
}
}
count=Buffer[j++];
if(count<1)
exit(0); // error
for(i=0; i < count; i++)
{
numrec=Buffer[j++];
if(numrec!=i)
exit(0); // error
classnamelen=Buffer[j++];
classname=new char[classnamelen];
for(k=0; k < classnamelen; k++)
classname[k]=Buffer[j++];
classname[k]='/0';
if(strcpy(classname,"OBJECT"))
{
namelen=Buffer[j++];
if(namelen<1 || namelen>19)
exit(0); // error
for(k=0; k < namelen; k++)
name[k]=Buffer[j++];
name[k]='\0';
arm=Buffer[j++];
obj=new OBJECT(arm,name);
this->push_back(obj);
}
else
if(strcpy(classname,"CIVIL"))
{
namelen=Buffer[j++];
if(namelen<1 || namelen>19)
exit(0); // error
for(k=0; k < namelen; k++)
name[k]=Buffer[j++];
name[k]='\0';
arm=Buffer[j++];
spd=Buffer[j++];
obj=new CIVIL(arm,name,spd);
this->push_back(obj);
}
else
exit(0); // error
}
}
Использование класса TStream
Собственно мне в программе надо сохранять и загружать содержимое контейнера из потока.
Я сохраняю количество элементво в контейнере, номер элемента, сигнатуру (кол-во букв в названии и само название класса), поля объекта. Потом пытаюсь загрузить, но вот этого и не выходит. Использую WriteBuffer, ReadBuffer. Первый вроде и работает, а вот второй нет, всегда выдает Buffer[0]==0, хотя там должно храниться кол-во элементов в контейнере (да и в файле там не 0 записан).
Ниже привожу исходный код, может кто-нибудь подскажет, что я делаю не так.
Код:
Заранее благодарен.