我有一个包含许多不同变量的类,例如那里有一些多维向量。
我听说您可以直接将数据存储和加载到文件中,但程度如何?
例如,如果我创建此类的实例,填充它,然后将其保存到文件中,我可以以相同的方式加载它吗?喜欢它是如何工作的?我是一次性保存它还是以某种方式分割数据?
答案 0 :(得分:6)
这不是C ++中初学者的主题
C ++没有自动方式将对象存储到文件/从文件加载对象。无论你选择哪种方式,你都必须自己实施。
您可能会选择重载<<
>>
运算符以用于流,或者您可能希望使用自己的Load
和Store
方法(或其他方法)您选择合适的名称,例如Serialize
/ Deserialize
)。我个人更喜欢创建自己的函数而不是使用运算符,但它只是我。
以下是一个简单的示例(包含重载的<<
和>>
运算符):
#include <fstream>
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass (int x) : m_x(x), m_y(x+1) {}
friend istream& operator >> (istream& in, MyClass& obj);
friend ostream& operator << (ostream& out, const MyClass& obj);
private:
int m_x;
int m_y;
};
istream& operator >> (istream& in, MyClass& obj)
{
in >> obj.m_x;
in >> obj.m_y;
return in;
}
ostream& operator << (ostream& out, const MyClass& obj)
{
out << obj.m_x << ' ';
out << obj.m_y << endl;
return out;
}
int main(int argc, char* argv[])
{
MyClass myObj(10);
MyClass other(1);
cout << myObj;
ofstream outFile ("serialized.txt");
outFile << myObj;
outFile.close();
ifstream inFile ("serialized.txt");
inFile >> other;
inFile.close();
cout << other;
return 0;
}
值得一提的是,您应该注意序列化格式。在上面的例子中,它只是文本;但是如果你要存储很多这些对象,你可能会开始考虑序列化二进制数据(在打开文件时你需要使用ofstream::binary
和ifstream:binary
标志,并且不需要额外的分隔符,例如序列化流中的' '
和endl
。
通常,当您考虑序列化时,您还需要考虑流的版本控制 - 这是另一个单独的主题。
答案 1 :(得分:0)
您可以考虑实施流运营商。
使用这些,您只需使用以下内容即可读写:
fileStream >> yourObject
fileStream << yourObject
基本上在&gt;&gt;运算符,您将读取流并使用找到的数据构造对象。 在&lt;&lt;&lt;运算符,您将对象写入流中的格式与预期读取的格式相同。
使用这种工作方式,您可以序列化您拥有的任何对象。
Google为“过载流运营商”了解如何实施这些运营商。
答案 2 :(得分:0)
您可以提供代码来迭代类的所有成员(可选地跳过不重要的成员并转换其他成员)并准备连续的数据流。这是狭义上的序列化。 当读取时,需要反向完成同样的事情。
在C ++中,您还可以执行二进制转储,例如CopyMemory(ptr, sizeof(*ptr)
。它只能在您的数据不包含指针时使用(特别是包含使用虚方法的类的隐藏指针)。它唯一的优点是简单和极快的速度。这种方法要求您的数据在内存中是连续的,有时对它自己有益。