Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование класса TStream

15K
19 декабря 2005 года
Arks
1 / / 19.12.2005
В своей программе у меня есть классы OBJECT и унаследованный от него CIVIL, которые у меня хранятся в контейнере ( class VECTOR : public vector<OBJECT*> {...} ).
Собственно мне в программе надо сохранять и загружать содержимое контейнера из потока.

Я сохраняю количество элементво в контейнере, номер элемента, сигнатуру (кол-во букв в названии и само название класса), поля объекта. Потом пытаюсь загрузить, но вот этого и не выходит. Использую WriteBuffer, ReadBuffer. Первый вроде и работает, а вот второй нет, всегда выдает Buffer[0]==0, хотя там должно храниться кол-во элементов в контейнере (да и в файле там не 0 записан).

Ниже привожу исходный код, может кто-нибудь подскажет, что я делаю не так.

Код:
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
 }
}


Заранее благодарен.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог