Привет всем!
У меня ошибка — не могу понять почему.
Открываю текстовый поток и передаю его как 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() не работает, но на упрощенном тестовом примере эта функция одинаково показала себя в текстовом и двоичном режимах.
Вправьте мне мозги, плииз
Заранее спасибо!
Для тех, кому интересно, еще немного кода
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;
}