2012-12-11 59 views
2

我正在讀取Microsoft Visual C++ 2008中H5文件中的數據集。對於int和double類型的數據,一切正常,但遇到字符串時遇到問題。在H5文件中,我有18個固定長度的字符串24.我的代碼如下;從C++中讀取hdf5中的字符串

StrType strdatatype(PredType::C_S1, 24); 
char *buffer1[18]; 
DataSet datasetCurveNames = riskFactorsH5.openDataSet("/gstrCurveNames"); 

datasetCurveNames.read(&buffer1, strdatatype); 

執行緩衝區1中充滿了壞指針。作爲替代我已經使用H5T_VARIABLE與修改來管理的可變長度字符串嘗試:

StrType strdatatype(PredType::C_S1, H5T_VARIABLE); 

這也將失敗。如果任何人都可以對這個問題有所瞭解,那將非常感激。

乾杯, 盧卡斯

回答

1

您需要爲滿弦分配內存時,庫不會爲你做。此時應更換

char *buffer1[18]; 

通過

char buffer1[18][24]; 

datasetCurveNames.read(&buffer1, strdatatype); 

應該

datasetCurveNames.read(buffer1, strdatatype); 

(無&

5

HDF5 C++ API嚴重記錄不足。這是我從數據集中讀取字符串的方式。我只在代碼完成IDE的幫助下計算出了這一點:

using namespace H5; 
std::string field_name("name of the field"); 
StrType datatype(0, H5T_VARIABLE); 
DataSpace dataspace(H5S_SCALAR); 
DataSet datset = group.openDataSet(field_name); 

std::string field_value; 
datset.read(field_value, datatype, dataspace); 
+0

這是如何工作的?何時分配了「field_value」的內存? – Walter

+0

@Walter std :: string類包含自己的內存管理。你可以創建一個std :: string併爲其分配一個C字符串。它將調整其內部數組以適當地存儲數據。或者,您可以直接調用std :: string :: resize來更改內部存儲器陣列的大小並分配字符。有關std :: string及其內存的更多信息,請參閱http://stackoverflow.com/q/9521629/950677。 – Nathan

+0

我知道這一切。我不知道的是'DataSet :: read()'分配一個C字符串。這是從數據類型明顯嗎? (不適合我)。 – Walter