Я использую некоторые файлы HDF5 в моей программе C ++, и у меня есть вопрос относительно H5Dopen
функция. Можно ли получить размеры набора данных hdf5 в заданном файле?
hid_t file, dset;
herr_t status;
file = H5Fopen (filenameField, H5F_ACC_RDONLY, H5P_DEFAULT);
dset = H5Dopen (file, "/xField", H5P_DEFAULT);
прежде чем я сделаю следующую строку, я хочу получить размеры dset
,
status = H5Dread (dset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &readBuf[0]);
Я только нашел H5Dget_storage_size
, но это не подходит для моего случая.
Кто-нибудь знает, как это сделать?
Для этого вам нужно использовать данныепространство функции с префиксом H5S.
HDF5 справочное руководство организован с использованием этих префиксов, так что это помогает понять это.
Сначала вам нужно получить пространство данных из вашего набора данных, используя H5Dget_space
:
hid_t dspace = H5Dget_space(dset);
Если ваше пространство данных просто (т.е. не ноль или же скаляр), то вы можете получить количество измерений, используя H5Sget_simple_extent_ndims
:
const int ndims = H5Sget_simple_extent_ndims(dspace);
и размер каждого измерения, используя H5Sget_simple_extent_dims
:
hsize_t dims[ndims];
H5Sget_simple_extent_dims(dspace, dims, NULL);
Размеры теперь хранятся в dims
,
В качестве альтернативы, это может быть сделано следующим образом (в случае простого пространства данных, см. Ответ Саймонса и при необходимости проверьте с помощью bool H5::DataSpace::isSimple() const
):
#include "H5Cpp.h"using namespace H5;
//[...]
DataSpace dataspace(RANK, dims);
//[...]
/*
* Get the number of dimensions in the dataspace.
*/
const int rank = dataspace.getSimpleExtentNdims();
Эта строка может быть избыточной в большинстве случаев, потому что вся задача может быть выполнена в две строки:
/*
* Get the dimension size of each dimension in the dataspace and
* store the dimentionality in ndims.
*/
hsize_t dims_out[rank];
const int ndims = dataspace.getSimpleExtentDims( dims_out, NULL);
Функция getSimpleExtentNdims()
можно назвать членом H5::DataSpace
пример.
Эти части кода взяты из страница примеров (readdata.cpp) из последних HDF5 C ++ справочное руководство.
Скомпилируйте все с h5c++
и это должно работать.