是否可以这样做?
我有一个包含已经写入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=0
到Nvl-1
),如何在不读取的情况下执行此操作数据vl[].p
也是如此?
答案 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()<<" ";
}