【问题标题】:Saving and loading data to a file c++ (beginner)将数据保存和加载到文件 c++(初学者)
【发布时间】:2012-07-07 02:30:33
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要将数据与字节序列相互转换。阅读“序列化”。
  • 您正在寻找“序列化”和“反序列化”。你用的是什么框架,还是这个纯STL?

标签: c++ loading save


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      有了这些,你可以简单地使用以下来读写:

      fileStream >> yourObject
      fileStream << yourObject 
      

      基本上在 >> 运算符中,您将读取流并使用找到的数据构造对象。 在

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

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

      【讨论】:

      • 我也是这样做的。我有一个序列化框架,它重载了相同的运算符。我相信有些人会说 - 不要重新发明轮子而只使用 boost 或其他东西。我喜欢控制做一些如此重要的事情的代码。
      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多