Как определить, что внутри архива буста что-то осталось? - PullRequest
0 голосов
/ 30 августа 2010

Есть ли способ определить, осталось ли что-либо внутри архива буста после того, как я прочитал из него? Я попробовал этот кусок кода:

const string s1("some text");
std::stringstream stream;
boost::archive::polymorphic_text_oarchive oAr(stream);
oAr << s1;

boost::archive::polymorphic_text_iarchive iAr(stream);
string s2;
iAr >> s2;

if (!stream.eof())
{
    // There is still something inside the archive
}

Я ожидал, что объект потока будет обновлен так, как будто я читаю непосредственно с него, но в приведенном выше коде stream.eof() всегда false, хотя я читаю все, что написал. Изменение строки на int дало тот же результат.

Причина, по которой я захотел эту способность, заключается в ситуациях, когда я читаю не те типы, которые пишу:

const string s1("some text");
std::stringstream stream;
boost::archive::polymorphic_text_oarchive oAr(stream);
oAr << s1;

boost::archive::polymorphic_text_iarchive iAr(stream);
int s2;
iAr >> s2; // string was written but int is read

Я знаю, что в этой ситуации я мало что могу сделать, но я надеялся, что, по крайней мере, проверка того, что я прочитал все, даст мне некоторое представление о том, было ли какое-то несоответствие между чтением и записью. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

Поток не может устанавливать какие-либо флаги, пока не попробует какую-либо операцию.

Вы можете использовать peek() для просмотра и возврата, но не удаления следующего символа в потоке.Этого достаточно, чтобы установить флаг, поэтому сделайте: if (stream.peek(), !stream.eof()) /* peek was not eof */.

2 голосов
/ 30 августа 2010

stream.eof () может быть установлено, когда вы пытались прочитать что-то после конца файла, а не когда вы прочитали последний байт из него.

Включение исключений в потоке и попытка чтения до тех пор, пока не сработает исключение.

...