【问题标题】:C++ save vector of vector of vector of class object into fileC++将类对象向量的向量保存到文件中
【发布时间】:2012-09-21 01:58:08
【问题描述】:

我在 C++ 中有一个类,如下所示:

class myCls
{
public:
   myCls();
   void setAngle(float angle);
   void setArr(unsigned char arr[64]);    
   unsigned char arr[64];
   double angle;
   int index;

   static float calcMean(const unsigned char arr[64]);
   static float sqrt7(float x);

};

现在在我的主程序中,我有一个类的 3D 矢量:

vector<vector<vector< myCls > > > obj;

矢量的大小也是动态变化的。我的问题是如何将向量的内容存储到文件中并在之后检索它?

我尝试了很多方法都没有成功。这是我的尝试:

std::ofstream outFile;
outFile.open(fileName, ios::out);
for(int i=0;i<obj.size();i++)
    {
        outFile.write((const char *)(obj.data()),sizeof(vector<vector<myCls> >)*obj.size());
    }
outFile.close();

为了阅读它:

vector<vector<vector<myCls>>> myObj;
id(inFile.is_open())
{
    inFile.read((char*)(myObj.data()),sizeof(vector<vector<myCls> >)*obj.size());
}

我得到的只是运行时错误。

谁能帮我解决这个问题?

【问题讨论】:

  • 首先你必须制定一个文件格式。然后你必须编写代码以该文件格式保存。然后您必须编写代码以读取该文件格式。你只是期待它通过魔法发挥作用。您必须准确决定文件的每个字节将包含什么,如何标记向量之间的边界,等等。 (如果您愿意,可以使用 XML 或 JSON。)您的 sizeof 调用完全中断,强烈建议您不了解 sizeof 的作用。提示:向量本身的大小不会随着你在其中放入更多东西而改变。
  • 我不确定你在问什么。你要我具体解释什么? (当我不知道您的知识和经验水平或您遇到的问题时,很难为您提供正确的信息。)它可能会帮助您将c++ serialization 打入您最喜欢的搜索引擎。
  • 我有刚刚描述的对象的 3D 矢量。如何保存这个矢量并从文件中取回它。
  • 正如我所说:首先你必须制定一个文件格式。然后你必须编写代码以该文件格式保存。然后您必须编写代码以读取该文件格式。你卡在第一步了吗?如果是这样,请首先为myCls 编写myCls 和您的班级之间转换的toTextfromText 函数(如果你想花哨的话,可能是operator&lt;&lt;operator&gt;&gt;)。

标签: c++ file object vector save


【解决方案1】:

如果您不太关心性能,请尝试boost::serialization。由于他们已经为 stl 容器实现了序列化功能,因此您只需为 myCL 编写序列化功能,其他一切都是免费的。由于您的成员变量都是公开的,您可以以侵入方式或non-intrusively 进行操作。

【讨论】:

    【解决方案2】:

    在内部,vector 通常由两个数字组成,代表当前长度和分配的长度(容量),以及指向实际数据的指针。所以“原始”对象的大小是固定的,大约是指针大小的三倍。这是您的代码当前编写的内容。指针指向的值不会被存储。当您读回内容时,您将指针设置为在大多数情况下甚至不会分配内存的内容,因此会出现运行时错误。

    一般来说,直接操作任何提供构造函数、析构函数或赋值运算符的类的内存是一个非常糟糕的主意。你的代码写入vector 的私有成员会彻底混淆内存管理,即使你也注意恢复指向的数据。出于这个原因,您应该只按照您的方式编写简单的 (POD) 数据。其他所有内容都应自定义以使用自定义代码。

    在向量的情况下,您可能会先存储长度,然后一次写入一个元素。对于阅读,您会读取长度,可能会相应地保留内存,然后一次读取一个元素。 boost::serialization 模板suggested by Voltron 可能会为您省去实现所有这些的麻烦。

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2012-09-04
      • 2022-11-17
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多