7

我有一个包含许多不同变量的类,例如那里有一些多维向量。

我听说您可以将数据直接存储和加载到文件中,但是到什么程度呢?

例如,如果我创建此类的一个实例,将其填充,然后将其保存到文件中,我可以以相同的方式加载它吗?就像它是如何工作的?我是一次性保存所有数据还是必须以某种方式拆分数据?

4

3 回答 3

7

这不完全是 C++ 初学者的主题

C++ 没有自动的方式来存储/加载您的对象到/从文件中。无论您选择哪种方式,您都必须自己实施。

您可能会选择重载<<an>>运算符以与流一起使用,或者您可能希望使用自己的LoadStore方法(或您选择的任何合适的名称,例如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::binaryifstream:binary标志,并且不需要额外的分隔符,如序列化流中的和)' 'endl

通常,当您考虑序列化时,您还想考虑流的版本控制——这是另一个单独的主题。

于 2012-07-06T16:12:49.377 回答
1

您可以提供一个代码来遍历类的所有成员(可以选择跳过不重要的成员并转换其他一些成员)并准备连续的数据流。这就是狭义的序列化。Ofc 阅读时需要反过来做同样的事情。

在 C++ 中,您还可以执行二进制转储,例如CopyMemory(ptr, sizeof(*ptr). 只有当您的数据不包含指针时它才能工作(尤其是包含具有虚拟方法的类的隐藏指针)。它唯一的优点是简单和惊人的速度。这种方法要求您的数据在内存中是连续的,这有时对它自己是有益的。

于 2012-07-06T16:02:25.713 回答
1

您可以考虑实现流运算符。

有了这些,您可以简单地使用以下内容进行读写:

fileStream >> yourObject
fileStream << yourObject 

基本上在 >> 运算符中,您将读取流并使用找到的数据构造对象。在 << 运算符中,您将对象以与您期望读取它的格式相同的格式写入流。

使用这种工作方式,您可以序列化您拥有的任何对象。

Google 为“重载流操作符”了解如何实现这些操作符。

于 2012-07-06T15:48:33.637 回答