2011-11-25 36 views
4

我有一个应用程序需要存储数据到hdf文件。存储数据集(C++类的实例)在hdf

是否有可能将数据集存储在hdf中,这实际上是一个C++对象?例如,我想将包含在下面的对象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 

} 

回答

0

如果你的类属性是简单类型(intfloatchar ......即使是这样类型的数组),你可以将它们保存在一个复合数据类型。

在您演示的示例类中,有一个STL vector。如果你有STL容器,你最好使用Boost serialization。输出将是可以存储在hdf5文件中的ASCII文本。例如,如果存储效率是您主要关心的问题,那么您应该小心将vector写入可变大小的数组中,并且更一般地说,可以在STL容器(和/或自定义对象)之间进行转换以及任何其他当您将对象导出到您的hdf5文件或从中导入时,您选择存储它们的hdf5数据类型。

1

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

我发现这种方法唯一的并发症是列表和序列。一种选择是将列表项存储在不同的数据集中,然后引用开始和结束索引。

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

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

这被映射到:

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

记录 'ADataset' 储存 'b_index'。 'BDataset'中的每条记录都包含该记录的值,然后是可选的next_index。标记值可以用于'next_index'以知道何时停止。

相关问题