我已经“手动”执行了类似我怀疑您想做的事情。
对于非简单类型(DataPktType),您可以考虑以下粗略概述(如果只是为了帮助您入门)。
首先,我向需要参与的所有类添加了2个虚拟方法-在我的情况下,我们称它们为存储和还原。 这些方法仅处理其自身类的数据属性。
从某种意义上说,restore()是store()的逆函数。
struct SType{
int Num;
char Word[20];
char sugg[20];
virtual void store(ostream& os);
virtual void restore(istream& is);
};
struct DataPktType
{
list MyList;
char filename[MAX_SIZE];
int numslaves;
virtual void store(ostream& os);
virtual void restore(istream& is);
};
因此,DataPktType.store()可能会将每个POD数据属性传输到ostream中:
DataPktType::store(ostream& os)
{
os << MyList.size(); // gotta know how many to extract later
for (auto it = myList.begin(); myList.end(); it++)
{
it->store(os); // tell the SType to store itself at this point in the stream
}
os << filename;
os << numslaves;
}
然后,“逆”可能类似于
DataPktType::restore(istream& is)
{
size_t listSize = 0;
is >> listSize;
// input error checks
for(size_t i=0; i
{
SType listItem;
listItem.restore(is); // assumes the list item contents are 'next' in the file
MyList.push_back(listItem); // I don't use std::list often,
// there seems to be several choices for adding to a list
}
is >> filename;
is >> numslaves;
}
这些是我认为您需要做的事情。
请注意,没有指针进入流。
请注意,对称不是完美的,但是您将必须弄清楚如何处理每个动作。
在我的努力下,我相信我在此过程中添加了一些简单的检查...
另外,我的团队在第一个实现中使用了文本。 作为人类,这将更容易调试,并且您可以使用编辑器来调试“对称”问题。
此外,您可能会发现文本I / O性能足够,因此可以将其保留为文本。
我们有一些紧迫的期限,最终选择了二进制I / O。 但是我们保留文本I / O只是为了测试。
祝好运。
PS-我们最终为存储/恢复的内容添加了一个“版本”号,以支持在项目代码演变过程中进行结构更改。