一个hdf5文件中有多少个数据集

时间:2017-05-04 12:58:37

标签: c++ matlab hdf5

我正在使用MATLAB的函数h5write将双变量foo写入名为saved_foos.h5的hdf5文件。我有一个循环,在每次迭代中更改foo并且我每次都在同一个hdf5文件中保存它,但是在另一个数据集中保存它,该数据集根据当前的迭代次数命名。

然后我用H5Cpp库在C ++程序中读出每个数据集的数据(eaach迭代),如下所示:

#include "H5Cpp.h"
using namespace H5;

double readDouble(std::string dir, std::string file, std::string s_dataset) {
    if (!fexists((dir + file + std::string(".h5")).c_str())) {
        throw std::runtime_error((std::string("File ") + dir + file + std::string(".h5 does not exist.")).c_str());
    }
    H5File file_h(dir + file + std::string(".h5"), H5F_ACC_RDONLY);
    DataSet dataset = file_h.openDataSet(s_dataset);
    DataSpace dataspace = dataset.getSpace();
    int rank = dataspace.getSimpleExtentNdims();
    hsize_t *dims_out = new hsize_t[rank];
    dataspace.getSimpleExtentDims(dims_out, NULL);
    if (rank>=2 && (dims_out[0] * dims_out[1] != 1)) {
        throw std::runtime_error("Requested dataset is not a scalar double value.");
    }
    double data;
    dataset.read(&data, PredType::NATIVE_DOUBLE);
    delete dims_out;
    return data;
}

但是如何确定给定hdf5文件中存储的数据集数量?

1 个答案:

答案 0 :(得分:2)

遍历文件

似乎您要在文件中列出数据集。 Here是一个非常完整的例子,对你的问题来说太过分了。为了帮助理解它,我将解释相关的代码会话:

C-API函数H5Literate用于遍历组中的所有对象。

/*
 * Use iterator to see the names of the objects in the file
 * root directory.
 */
cout << endl << "Iterating over elements in the file" << endl;
herr_t idx = H5Literate(file->getId(), H5_INDEX_NAME, H5_ITER_INC, NULL,    file_info, NULL);
cout << endl;

其中file_info是回调函数:

/*
 * Operator function.
 */
herr_t
file_info(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *opdata)
{
    hid_t group;
    group = H5Gopen2(loc_id, name, H5P_DEFAULT);
    cout << "Name : " << name << endl; // Display the group name.
    H5Gclose(group);
    return 0;
}

在您的情况下,其他迭代函数而不是H5Literate可能更合适。请找到它here。可以找到遍历文件的纯C-API示例here

仅获取数字

如果所有数据集都存储在root下,并且其名称的格式已知。有一个更简单的解决方案来获取数据集的数量:

    hsize_t  num_obj;
    H5Gget_num_objs(file->getId(), &num_obj); // if success, num_obj will be assigned the number of objects in the group