只读取可变长度数组的长度而不读取hdf5中的元素

时间:2015-10-09 15:23:41

标签: c++ c hdf5 variable-length-array

是否可以这样做?

我有一个包含已经写入hdf5文件的Nvl HDF5-variable-length-arrays的数组。我可以通过(以下代码片段在c ++中读取整个数据,但使用C版本的hdf5 API的答案同样受欢迎

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

但是,如果我只想读取每个可变长度对象的长度,即vl[i].len(对于i=0Nvl-1),如何在不读取的情况下执行此操作数据vl[].p也是如此?

2 个答案:

答案 0 :(得分: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 ++中它的工作原理相同。

答案 1 :(得分: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()<<" ";
}