Проблема с потоками
От: KosTiger Россия  
Дата: 27.04.07 10:25
Оценка:
Привет всем!

У меня ошибка — не могу понять почему.

Открываю текстовый поток и передаю его как shared_ptr<ifstream> функции, которая должна загрузить из этого потока один из объектов. Пробую загрузить один из объектов, если не получается то другой.

Выглядит это так
spIobject loader(sp_ifstream ifs)
{
  spIobject res;
  spOneObject oo;
  spAnotherObject ao;
  try{
    oo = OneObject::load( *ifs );
  }
  catch( ... )
  {
  }
  if( oo.use_count() == 0 )
  {
    try{
      ao = AnotherObject::load( *ifs );
    }
    catch( ... ) 
    {
    }
  }
  else
    res = oo;
  return res;
}


Где типы определены следующим образом: spТип — boost::shared_ptr<Тип> ,
class Iobject
{
...
};

class OneObject : protected Iobject
{
friend spIobject loader(sp_ifstream ifs);
...
};

class AnotherObject : public Iobject
{
};


В функциях загрузки сохраняю позицию в потоке и, если не могу загрузить объект, то восстанавливаю прежнюю позицию.

Не пойму в чем косяк. Когда-то слышал, что у текстовых потоков seekg() не работает, но на упрощенном тестовом примере эта функция одинаково показала себя в текстовом и двоичном режимах.

Вправьте мне мозги, плииз

Заранее спасибо!
Re: Как вернуть позицию в потоке
От: KosTiger Россия  
Дата: 27.04.07 11:08
Оценка:
Для тех, кому интересно, еще немного кода

class ifstream_pos_returner
  {
    ifstream&  ifs;
    unsigned old_pos;
    public:
      ifstream_pos_returner( ifstream& infs , unsigned pos ) : ifs( infs ) , old_pos( pos )
      {
      }
      void reset( unsigned pos )
      {
        old_pos = pos;
      }
      ~ifstream_pos_returner()
      {
        ifs.seekg( old_pos , std::ios::beg );
      }
  };
...
spOneObject OneObject::load( ifstream& ){
  ifstream_pos_returner ret( ifs , ifs.tellg() );
  spOneObject res;
  ...
  if( something goes wrong)
    return res;
  ...
  ret.reset( ifs.tellg() );
  return res;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.