2013-01-19 64 views
2

我有一個hdf5化合物數據集,它是在Python中構建的,我正在嘗試讀取它。我有四列,其中一個是長度爲1的字符串。我設法讀取除字符串列之外的所有字符。下面是示例代碼,我嘗試只讀的字符串列:從C++中的HDF5讀取複合數據類型的字符串

#include <string> 
#include <iostream> 
#include "H5Cpp.h" 

typedef struct data_type { 
    char string_column[1]; 
} data_type; 

int main (void) 
{ 
    int NBR_OF_ROWS = 28884; 
    H5::H5File file = H5::H5File(MY_FILE, H5F_ACC_RDONLY); 
    H5::DataSet dataset = H5::DataSet(file.openDataSet(MY_DATASET)); 

    H5::CompType mtype(sizeof(data_type)); 
    mtype.insertMember("member", HOFFSET(data_type, string_column), 
      H5::PredType::C_S1); 
    data_type *data = new data_type[NBR_OF_ROWS]; 
    dataset.read(data, mtype); 

    std::cout << "string column " << data[0].string_column << std::endl; 

    return 0; 
} 

這將編譯但不輸出任何:(我想在堆上分配,但無濟於事數據陣列我用G ++ ubuntu上。 。

任何幫助將非常感激。

+0

你獲得提示,或在程序卡住?如果是這樣,您可以在其他語句之間添加打印語句以查看程序卡住的位置。或者,使用調試器逐行執行。 –

+0

恐怕我收到提示。似乎string_column char只是空的。我嘗試了一些東西,但沒有運氣。我試着在堆上爲每個data_type實例分配char [],但之後我得到了亂碼和valgrind的輸出,抱怨無效讀取。 – fhal

+0

如果你在堆棧中分配的話,你沒有得到那些valgrind錯誤,就像你提問中提供的例子那樣?我看到的唯一可疑的事情是,在聲明'data'時使用可變長度數組,因爲'NBR_OF_ROWS'實際上並不是編譯時常量。變長數組不是標準C++的一部分,但它可能是'g ++'允許它作爲擴展。 –

回答

2

我認爲你的問題來自於你使用字符串數據類型。你沒有指定大小,你剛纔說這是一個字符串

嘗試做一個

H5::StrType string_type(H5::PredType::C_S1, 1); 

那麼它在複合數據類型使用:長度爲1 H5::StrType

mtype.insertMember("member", HOFFSET(data_type, string_column), string_type); 
+0

恐怕它沒有工作:(仍然沒有打印任何東西。謝謝無論如何。 – fhal

+0

@fhal還有一件事,嘗試聲明'string_column'的大小2而不是1,C字符串爲零 - 終止,所以他們需要一個額外的細胞。 – Simon

+0

@fhal任何關於這方面的消息嗎?它工作嗎? – Simon

相關問題