2011-11-25 40 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'以知道何時停止。

相關問題