读取来自提升binary_iarchive不正确的数据
incorrect data from boost binary_iarchive read
我正在尝试从二进制文件中读取自定义数据
#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
标志。
我使用十六进制查看器工具(Linux 上的 ghex(检查了二进制文件,fstream::read
返回正确的值。这里可能出了什么问题?
我正在使用带有 boost 1.70 和 c++17 的 gcc-8.3 和 VS2017
正如我在代码中评论的那样,二进制文件不是由 boost 序列化库创建的。
在这种情况下,您将无法使用boost::archive::binary_iarchive
读取文件,除非您的文件碰巧偶然共享完全相同的二进制格式。
您需要为加载存档概念创建一个新的实现,因为 Boost 调用它。换句话说,与当前格式匹配的新archive
类型(至少用于加载(。
因此使用
no_header
标志。
此标志仅跳过boost::archive::binary_oarchive
写入以检查大小/字节序等的标头,但在不知道其格式的情况下,它无法读取数据。这就是为什么你必须编写自己的档案。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 不正确的比较和交换计数器输出用于快速排序功能