gpt4 book ai didi

c++ - 序列化 vector 的 vector 结构

转载 作者:行者123 更新时间:2023-11-28 03:11:35 38 4
gpt4 key购买 nike

我这里的情况有点复杂。我想将一个 vector 结构保存到一个文件中,并在一段时间后读取它。但问题在于阅读。我不知道如何从保存的文件中将所有 vector 填充到结构中。

 struct TDNATable{


std::vector<String>GenomOne;
std::vector<String>GenomeL;
std::vector<String>GenomeER;
std::vector<String>GenomeRET;
std::vector<String>GenomeSEL;

};

std::vector<TDNATable> DnaTbl;



//PSEUDO CODE:
//For example simple writing could be
ofstream file("C:\\Users\\User11\\Desktop\\SNF_TBL.INI", ios::binary);
file.write((char*)&DnaTbl, sizeof(DnaTbl));

//Problem comes with reading
// impl
ifstream file("C:\\Users\\User11\\Desktop\\SNF_TBL.INI",
std::ifstream::binary);

// get pointer to associated buffer object
std::filebuf* pbuf = file.rdbuf();

// get file size using buffer's members
std::size_t size = pbuf->pubseekoff(0, file.end, file.in);
pbuf->pubseekpos(0, file.in);

// allocate memory to contain file data
char* buffer = new char[size];

// get file data
pbuf->sgetn(buffer, size);

file.close();


for (int i = 0; i < SnfTbl.size(); i++) {

//Back inserter can be used only with 1D vector
std::copy(buffer, buffer +sizeof(buffer),
std::back_inserter(SnfTbl[i].GenomeL);

std::copy(buffer, buffer +sizeof(buffer),
std::back_inserter(SnfTbl[i].GenomeER));



}

RefreshDFSGrid();


delete[]buffer;
file.close();

我尝试使用 boost/serialize 但没有成功。

你知道我怎样才能以一种优雅的方式保存/加载这个 ds 吗?谢谢!

最佳答案

对于简单的任务,Boost 可能有点矫枉过正。在我自己的代码中,我用各种流类解决了这个问题。我是这样做的:

  1. virtual Read(buffer, byteCount) = 0声明抽象基类和 virtual Write(buffer, byteCount) = 0 .在下图中,IArchiveIIArchiveO是这样的基类。

  2. 对于内置类型,提供 operator <<operator >>只需适本地调用 Read() 和 Write()。

  3. 对于 vector/字符串/...等库类型,提供基于基本类型运算符构建的非成员模板运算符(例如,您不再调用原始读/写)。

例如,我是如何处理 vector 的:

template <class T>
IArchiveO& operator << (IArchiveO& a_Stream, const std::vector<T>& a_Vector)
{
a_Stream << a_Vector.size();
for (size_t i = 0; i < a_Vector.size(); i++)
{
a_Stream << a_Vector[i];
}

return a_Stream;
}

template <class T>
IArchiveI& operator >> (IArchiveI& a_Stream, std::vector<T>& a_Vector)
{
a_Vector.clear();

size_t contSize = 0;
a_Stream >> contSize;

a_Vector.resize(contSize);
for (size_t i = 0; i < contSize; i++)
{
a_Stream >> a_Vector[i];
}

return a_Stream;
}

对于您自己的非库类型,以相同的方式提供运算符。例如,您的代码如下所示:

IArchiveI& operator >> (IArchiveI& a_Stream, TDNATable& a_Value)
{
a_Stream >> a_Value.GenomOne;
a_Stream >> a_Value.GenomeL;
a_Stream >> a_Value.GenomeER;
a_Stream >> a_Value.GenomeRET;
a_Stream >> a_Value.GenomeSEL;
return a_Stream;
}
  1. 从基类继承并创建提供存储的类,例如,读取/写入文件。您只需要重载 virtual Read(buffer, byteCount)virtual Write(buffer, byteCount) .

  2. 最后,您构造一个存储类的实例并一次性序列化您的整个数组(在此代码中,CFileArchiveO 继承自 IArchiveO,重载 Write()): CFileArchiveO ar(...);
    ar << DnaTbl;

诀窍是,当编译器对每种类型都有运算符时,它自动为您拥有的任何嵌套构建代码,即使它是 vector<vector<vector<string>>>

关于c++ - 序列化 vector 的 vector 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18315263/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com