неверные данные из бинарного чтения - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь прочитать пользовательские данные из двоичного файла

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <fstream>

struct Data 
{
    int xs, ys;
    double ullat, ullon, lrlat, lrlon;
    double minval, maxval;

   // and some vector of floats
};

namespace boost { 
namespace serialization {

template <class Archive>
void
serialize (Archive& ar, Data& d, const unsigned int version)
{
    ar & d.xs & d.ys;
    ar & d.ullat & d.ullon & d.lrlat & d.lrlon;
    ar & d.minval & d.maxval;
}

} // namespace serialization
} // namespace boost

int main (void)
{
    std::ifstream fin ("test.bin", std::ios::in | std::ios::binary);

    // the binary file was not created by boost serialization library. No header information
    boost::archive::binary_iarchive arc (fin, boost::archive::no_header); 

    Data d;
    arc >> d;
}

После этого d содержит нежелательные значения (огромные -ve или + ve числа).

ЕслиЯ использую fstream::read для чтения файла в соответствии с макетом d Я получаю правильные значения. Я не могу понять, что здесь происходит. Как я прокомментировал в коде, двоичный файл был , а не , созданный библиотекой Boost-сериализации. Следовательно, используя флаг no_header.

Я проверил двоичный файл с помощью инструмента шестнадцатеричного просмотра (ghex на linux), и fstream::read возвращает правильные значения. Что может быть не так?

Я использую gcc-8.3 и VS2017 с boost 1.70 и c ++ 17

1 Ответ

2 голосов
/ 05 октября 2019

Как я прокомментировал в коде, двоичный файл не был создан библиотекой boost serialization.

В этом случае вы не сможете прочитать файл, используя boost::archive::binary_iarchiveесли ваш файл случайно не использует тот же самый двоичный формат случайно.

Вам нужно будет создать новую реализацию для Загрузка концепции архива , как называет его Boost. Другими словами, новый тип archive (для загрузки по крайней мере), который соответствует вашему текущему формату.

Следовательно, используется флаг no_header.

Этот флаг толькопропускает заголовок, который boost::archive::binary_oarchive пишет для проверки размеров / порядкового номера и т. д., но он не может прочитать ваши данные, не зная их формат. Вот почему вы должны написать свой собственный архив.

...