我有一个包含许多不同变量的类,例如那里有一些多维向量。
我听说您可以将数据直接存储和加载到文件中,但是到什么程度呢?
例如,如果我创建此类的一个实例,将其填充,然后将其保存到文件中,我可以以相同的方式加载它吗?就像它是如何工作的?我是一次性保存所有数据还是必须以某种方式拆分数据?
这不完全是 C++ 初学者的主题
C++ 没有自动的方式来存储/加载您的对象到/从文件中。无论您选择哪种方式,您都必须自己实施。
您可能会选择重载<<
an>>
运算符以与流一起使用,或者您可能希望使用自己的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
通常,当您考虑序列化时,您还想考虑流的版本控制——这是另一个单独的主题。
您可以提供一个代码来遍历类的所有成员(可以选择跳过不重要的成员并转换其他一些成员)并准备连续的数据流。这就是狭义的序列化。Ofc 阅读时需要反过来做同样的事情。
在 C++ 中,您还可以执行二进制转储,例如CopyMemory(ptr, sizeof(*ptr)
. 只有当您的数据不包含指针时它才能工作(尤其是包含具有虚拟方法的类的隐藏指针)。它唯一的优点是简单和惊人的速度。这种方法要求您的数据在内存中是连续的,这有时对它自己是有益的。
您可以考虑实现流运算符。
有了这些,您可以简单地使用以下内容进行读写:
fileStream >> yourObject
fileStream << yourObject
基本上在 >> 运算符中,您将读取流并使用找到的数据构造对象。在 << 运算符中,您将对象以与您期望读取它的格式相同的格式写入流。
使用这种工作方式,您可以序列化您拥有的任何对象。
Google 为“重载流操作符”了解如何实现这些操作符。