在hdf中存储数据集(C ++类的实例)

时间:2011-11-25 08:42:07

标签: c++ hdf5

我有一个需要将数据存储到hdf文件的应用程序。

是否可以将数据集存储在实际上是C ++对象的hdf中?例如,我想将下面的对象a中包含的数据存储到hdf文件(hdf4或hdf5)。我可以这样做吗?如果是的话,如果有人可以证明这样做,我将不胜感激。谢谢。

class A(){

public:
   A(int i, double j):i(i), j(j){};
   ~A();
   int i;
   double j;
   int* ai;
   vector<int> b;
   setValues(int i, double j){};
}

void main(){

  A *a;
  a = new A(10, 10.2);

  // Store this data to hdf4 or hdf5


  //
  A *a2;

  // now read in the data stored in hdf file and assign the value here

}

2 个答案:

答案 0 :(得分:1)

一种选择是使用复合类型,并将结构成员显式映射到HDF支持的基本类型。

我用方法找到的唯一复杂因素是列表和序列。一种选择是将列表项存储在不同的数据集中,然后引用开始和结束索引。

对于数据不连续或更复杂的情况,一种方法是使用链表类型构造。所以对于以下内容:

class A {
    int i;
    vector<int> b;
}

这映射到:

ADataset => { i, b_index };
BDataset => { value, next_index };

记录&#39; ADataset&#39;存储&#39; b_index&#39;。 “BDataset”中的每条记录都是&#39;包含该记录的值,然后是可选的next_index。哨兵值可以用于&#39; next_index&#39;知道什么时候停止。

答案 1 :(得分:0)

如果您的类属性是简单类型(intfloatchar ...甚至此类型的数组),您可以将它们保存为复合数据类型。

在您显示的示例类中,有一个STL vector。如果你有STL容器,你最好使用Boost serialization。输出将是您可以存储在hdf5文件中的ASCII文本。

如果存储效率是您主要关心的问题,那么您应该自己编写一个可变大小数组中的vector,更一般地说,在STL容器(和/或自定义对象)之间进行转换)以及在hdf5文件中导出和导入对象时选择存储它们的hdf5数据类型。