- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我尝试反序列化二进制数据时,我得到了这个:
异常:boost::archive::archive_exception 在内存位置
写:
std::ofstream ofs(savePath);
boost::archive::binary_oarchive out_arch(ofs);
out_arch << mData;
ofs.close();
阅读:
std::ifstream ifs(loadPath);
boost::archive::binary_iarchive in_arch(ifs);
in_arch >> _mData;
当我使用 text_iarchive\text_oarchive 时工作正常。
序列化数据结构mData为ColorMatrix<std::map<int, float>>
数据;
#include <algorithm>
#include <memory>
#include <boost/serialization/vector.hpp>
template<class T, class A = std::allocator<T> >
struct ColorMatrix {
typedef T value_type;
typedef std::vector<value_type, A> Container;
ColorMatrix() : _b(0) {}
ColorMatrix(int a, int b, value_type const& initial = value_type())
: _b(0)
{
resize(a, b, initial);
}
ColorMatrix(ColorMatrix const& other)
: _data(other._data), _b(other._b)
{}
ColorMatrix& operator=(ColorMatrix copy) {
swap(*this, copy);
return *this;
}
bool empty() const { return _data.empty(); }
void clear() { _data.clear(); _b = 0; }
int dim_a() const { return _b ? _data.size() / _b : 0; }
int dim_b() const { return _b; }
value_type* operator[](int a) {
return &_data[a * _b];
}
value_type const* operator[](int a) const {
return &_data[a * _b];
}
void resize(int a, int b, value_type const& initial = value_type()) {
if (a == 0) {
b = 0;
}
_data.resize(a * b, initial);
_b = b;
}
void copyTo(ColorMatrix<T, A> &other){
int myA = dim_a();
int myB = dim_b();
int otherB = other.dim_b();
for (int line = 0; line < myA; ++line){
int myStart = line * myB;
int myEnd = (line + 1) * myB;
int otherStart = line*otherB;
std::cout << "Line: " << line << " S1: " << myStart << " E1: " << myEnd << " S2: " << otherStart << std::endl;
std::copy(_data.begin() + myStart,
_data.begin() + myEnd,
other._data.begin() + otherStart);
}
}
friend void swap(ColorMatrix& a, ColorMatrix& b) {
using std::swap;
swap(a._data, b._data);
swap(a._b, b._b);
}
private:
Container _data;
int _b;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & _data;
ar & _b;
}
};
UPD1
我在序列化步骤中发现了一个问题。有测试数据一切ok。
测试代码一切正常:
#include <iostream>
#include <vector>
#include <math.h>
#include <fstream>
#include <map>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/map.hpp>
#include "ColorMatrix.h"
using namespace std;
int main()
{
cout << "start program" << endl;
ColorMatrix<std::map<int, float>> mData;
ColorMatrix<std::map<int, float>> mData2;
const int mSize = 200;
mData.resize(mSize, mSize);
cout << "init" << endl;
for (int x = 0; x < mSize; x++){
for (int y = 0; y < mSize; y++){
if (y % 2 == 0){
mData[x][y][0] = 1.f;
mData[x][y][1] = 0.66666f;
}
else if (y % 3 == 0){
mData[x][y][0] = 1.f;
mData[x][y][1] = 0.1111111111f;
mData[x][y][3] = 0.44444444f;
}
else{
mData[x][y][0] = 1.f;
}
}
}
cout << "write data" << endl;
std::ofstream ofs("data.dat");
boost::archive::binary_oarchive out_arch(ofs);
//boost::archive::text_oarchive out_arch(ofs);
out_arch << mData;
ofs.close();
cout << "read data" << endl;
std::ifstream ifs("data.dat");
if (!ifs) {
cout << "read error!" << endl;
return 1;
}
boost::archive::binary_iarchive in_arch(ifs);
//boost::archive::text_iarchive in_arch(ifs);
in_arch >> mData2;
cout << "complete" << endl;
return 0;
}
最佳答案
两个提示
确保存档的生命周期是封闭的,特别是不要重叠
文本存档工作的事实让我想知道您是否正确地编写了二进制流。另请注意,您不能在 Boost Serialisation 中不将多个存档安全地连接到同一个 steam。
我有另一个答案,详细说明了这种情况以及它似乎如何适用于本网站的文本文件。
更新
查看代码后(谢谢!)我发现以下注意事项适用:
事实上,在简单示例中,您未能明确管理存档对象的生命周期。我已经看到这会导致问题(在 MSVC IIRC 上)。您也可以在 [SO] 上找到它。所以,写:
cout << "write data" << endl;
{
std::ofstream ofs("data.dat");
boost::archive::binary_oarchive out_arch(ofs);
//boost::archive::text_oarchive out_arch(ofs);
out_arch << mData;
}
cout << "read data" << endl;
{
std::ifstream ifs("data.dat");
if (!ifs) {
cout << "read error!" << endl;
return 1;
}
boost::archive::binary_iarchive in_arch(ifs);
//boost::archive::text_iarchive in_arch(ifs);
in_arch >> mData2;
}
您不使用 std::ios::binary
,这可能会产生影响(可能取决于平台):
std::ofstream ofs("data.dat", std::ios::binary);
// ...
std::ifstream ifs("data.dat", std::ios::binary);
I'd also suggest improving the naming of the fields and parameters in teh
ColorMatrix
class.
关于c++ - 异常:内存位置的 boost::archive::archive_exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33317403/
我正在尝试获取从过去的 startposition/location 到当前移动的 currentposition/location 的距离(以米为单位)。 我确实有工作正常的currentposit
所以我有一堆绝对覆盖的 div。用户通过在叠加层上拖动来创建方形 div。如果您要创建一个 div,然后放大和缩小,div 会保持在同一位置,因为它对叠加层是绝对的,如前所述。 然而问题就出在这里。您
我想找到 View 在显示屏幕上的位置。 为此,我使用了 view.getLeft() 、view.getBottom() 、view.getRight() 等方法> , view.getTop()。
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
所以我有一个名为 MARKS 的表,我有这些列 STUDENT_ID, CLASSFORM_NAME, ACADEMIC_YEAR, TERM, SUBJECT_NAME, TOTAL_MARKS
我有一个问题我无法理解,请帮助: 我开发了带有图像的 html 页面,并使用 jQuery UI 帮助使它们可拖动,我将这些图像位置设置为相对位置并给出了左侧和顶部像素,这是页面的链接 http://
我正在尝试创建一个 CSS 动画,它在 sprite 表中循环播放 16 个图像,给人一种幽灵“漂浮”的错觉。动画通过在 background-position 位置之间移动以显示不同状态的幽灵来实现
我正在创建这个网站的 WebView https://nearxt.com/打开时询问位置但是当我使用此链接在 flutter 中创建 webview 时那么它就无法定位我还在应用程序中定义了位置,但
我正在以编程方式创建一个需要跨越 2 个屏幕的窗口。正在创建的窗口的大小是正确的,但窗口大约从第一个屏幕的一半开始。我可以将它拖回第一个屏幕的开头,NSWindow 非常适合。 我只需要知道在窗口的起
位置“/”的匹配叶路由没有元素。这意味着默认情况下它将呈现一个空值,从而导致一个“空”页面 //App.js File import { BrowserRouter as Router, Routes
我有一个运行 Ubuntu 和 Apache 的 VPS 例如,假设地址是:5.5.5.5 在 VPS 上,我有一个名为 eggdrop 的用户(除了我的 root 用户)。 用户 eggdrop 有
我有一个 JLabel与 ImageIcon ,我使用 setIcon() JLabel中的函数. ImageIcon然后上来,坐在我的JLabel 的文字左侧.是否有可能拥有 ImageIcon在文
我的图中有节点,它们的 xlabels 位于它们的左上方。我怎样才能改变这个位置?我希望 xlabels 正好位于节点本身的旁边。 最佳答案 xlp是你想要的属性,但它没有做任何事情。 你不能改变位置
我对基本的 VIM 功能有疑问:(我尝试谷歌搜索但找不到答案) 如何列出所有自定义功能。(我做了 :function 并且不能找到我的自定义函数) 如何获得自定义函数列表中的函数(或它们的存储位置)。
我是 PHP 的新手,虽然我一直在搜索,但我不知道该怎么做。 我知道可以使用 Location("some page") 进行重定向。我还读到,只要没有向用户显示任何内容,它就可以工作。 我想做的是:
如果在 jgrowl.css 中位置更改为“center”,我如何将其覆盖为默认值,即“top-right” $.jGrowl(data, { header: 'data', an
我需要根据用户是否滑动屏幕顶部、屏幕中间或屏幕底部来触发不同的事件。我正在尝试找出最好/最简单的方法来做到这一点,因为我很确定没有办法从 UISwipeGestureRecognizer 获取位置。
我需要枚举用delphi编写的外部应用程序中使用的类 ,因此我需要访问VMT表以获取该信息,但是我找不到任何有关如何在exe(由delphi生成)文件中找到VMT(虚拟方法表)的位置(地址)的文档。
在 D2010 (unicode) 中是否有像 Pos 这样不区分大小写的类似函数? 我知道我可以使用 Pos(AnsiUpperCase(FindString), AnsiUpperCase(Sou
我正在尝试为我的reveal.js 演示文稿制作一个标题,该标题会粘贴在屏幕顶部。标题中的内容在每张幻灯片的基础上都是动态的,因此我必须将标记放在 section 标记中。 显然,如果标记在 sect
我是一名优秀的程序员,十分优秀!