将数据保存并加载到文件c ++(初学者)

时间:2012-07-06 15:43:56

标签: c++ loading save

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

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

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

3 个答案:

答案 0 :(得分:6)

这不是C ++中初学者的主题

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

您可能会选择重载<< >>运算符以用于流,或者您可能希望使用自己的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

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

答案 1 :(得分:0)

您可以考虑实施流运营商。

使用这些,您只需使用以下内容即可读写:

fileStream >> yourObject
fileStream << yourObject 

基本上在&gt;&gt;运算符,您将读取流并使用找到的数据构造对象。 在&lt;&lt;&lt;运算符,您将对象写入流中的格式与预期读取的格式相同。

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

Google为“过载流运营商”了解如何实施这些运营商。

答案 2 :(得分:0)

您可以提供代码来迭代类的所有成员(可选地跳过不重要的成员并转换其他成员)并准备连续的数据流。这是狭义上的序列化。 当读取时,需要反向完成同样的事情。

在C ++中,您还可以执行二进制转储,例如CopyMemory(ptr, sizeof(*ptr)。它只能在您的数据不包含指针时使用(特别是包含使用虚方法的类的隐藏指针)。它唯一的优点是简单和极快的速度。这种方法要求您的数据在内存中是连续的,有时对它自己有益。