2015-10-09 44 views
0

是否可以這樣做?只讀取可變長度數組的長度而不讀取hdf5中的元素

我有一個數組包含NvlHDF5-variable-length-arrays已經寫入hdf5文件。我可以由整個數據讀出(下面的片段是在C++中,但使用HDF5 API的C版的答案是同樣歡迎

hvl_t vl[Nvl]; 
dset.read(vl, VarLenType(&PredType:NATIVE_INT)); 

然而,如果我只想讀每個的長度可變長度對象,即vl[i].len(對於i=0Nvl-1),如何在不讀取數據vl[].p的情況下執行此操作?

+0

是的,同時使用C和C++標記是合適的,因爲HDF5 C++包裝器非常接近參考C API。 – Simon

+0

@Simon:這不是一個很好的理由。標記您實際使用的語言。不是其他一些語言,看起來有點相似的其他語言,或者是其他語言的一種圖書館被寫入。您正在使用的語言。 –

回答

1

是的,即使沒有直接的函數調用來完成它也可以完成。您必須求助於C:sizeof(x)/sizeof(x[0])中的經典數組大小宏。

如果您的可變長度數組的類型爲vl_type,那麼您可以使用vl_size = H5Dvlen_get_buf_size(vl_type)以字節爲單位獲取它的大小。然後您需要將該大小除以元素類型的字節大小。這種類型可以通過elem_type = H5Tget_super(vl_type)及其與elem_size = H5Tget_size(elem_type)的字節大小找到。最後你有可變長度數組的長度:vl_size/elem_size

PS:我在這裏使用了C API,因爲文檔更好,但它在C++中的工作原理相同。

+0

這不是推薦的方式來獲取C++中的數組大小。這是容易出錯和危險的。瞭解準確的語言標籤爲什麼重要這就是說...我甚至不知道你會怎麼做與VLA做。主要是因爲在C++中不存在VLA。瞭解準確的語言標籤爲什麼重要 –

+0

@LightnessRacesinOrbit然後隨意刪除C++標籤,因爲語言與問題無關:D – Simon

+0

@ Si mon:如果這是真的,那麼問題就會出現,話題。 –

0

繼Simon的回答後,使用hyperslab循環遍歷元素,然後查詢每個元素的大小來完成這項工作。

hsize_t dim[1]; 
VarLenType vl_t(PredType:NATIVE_INT); 
DataSpace dspace=dset.getSpace(); 
dspace.getSimpleExtentDims(dim); 
hsize_t count[]={1}, offset[]={0}, stride[]={1}, block[]={1}; 
for(offset[0]=0;offset[0]<dim[0];offset[0]++) 
{ 
     dspace.selectHyperslab(H5S_SELECT_SET, count, offset, stride, block); 
     cout<<dset.getVlenBufSize(vl_t, dspace)/vl_t.getSuper().getSize()<<" "; 
}