我在这里有点复杂的情况。 我想将一个向量结构保存到文件中并在一段时间后读取它。 但问题在于阅读。我不知道如何从保存的文件中将al 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? 谢谢!
答案 0 :(得分:2)
对于简单的任务来说,提升可能是一种过度杀伤力。在我自己的代码中,我用各种类的流解决了这个问题。我这样做了:
使用virtual Read(buffer, byteCount) = 0
和virtual Write(buffer, byteCount) = 0
声明抽象基类。如下图所示,IArchiveI
和IArchiveO
是此类基类。
对于内置类型,请提供operator <<
和operator >>
,只需根据需要调用Read()和Write()。
对于诸如vector / string / ...之类的库类型,提供基于基类型运算符构建的非成员模板运算符(例如,您不再调用原始读/写)。
例如,我是如何处理矢量的:
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;
}
从基类继承并创建提供存储的类,例如,读/写文件。您只需要重载virtual Read(buffer, byteCount)
和virtual Write(buffer, byteCount)
。
最后,构建一个存储类实例并一次性序列化整个数组(在此代码中,CFileArchiveO继承自IArchiveO,重载Write()):
CFileArchiveO ar(...);
ar << DnaTbl;
诀窍是,当编译器为每种类型都有运算符时,自动为您拥有的任何嵌套构建代码,即使它是vector<vector<vector<string>>>
答案 1 :(得分:0)
std::vector
在插入数据时分配内存。
所以
file.write((char*)&DnaTbl, sizeof(DnaTbl));
仅保存std::vector<TDnaTbl>
的“元数据”并省略您插入的数据,该数据存储在内存中的其他位置。您必须迭代向量并手动保存元素计数和元素数据。