c++ - 测试 HDF5/c++ 中存在的数据集并处理错误
问题描述
我正在使用 C++ 中的 HDF5 库阅读 *.hdf5 系列文件。这些文件具有相同的数据集(相同keys
,但信息不同),但有时单个数据集可能会在文件中丢失(例如,在 100 个文件中我有数据集apple
,在 3 个文件中我没有任何apple
数据集),在这些情况下有以下例外:
HDF5-DIAG: Error detected in HDF5 (1.10.7) thread 0:
#000: H5D.c line 298 in H5Dopen2(): unable to open dataset
major: Dataset
minor: Can't open object
[...]
#005: H5Gloc.c line 376 in H5G__loc_find_cb(): object 'apple' doesn't exist
major: Symbol table
minor: Object not found
terminate called after throwing an instance of 'H5::GroupIException'
当发生此错误时,我想处理此异常,例如为该文件创建一个空的苹果数据集。
在这里,我发布了读取文件->组->数据集的代码块。处理错误,我想创建一个空GoldenApples
向量,即使数据集apple
不存在。
std::string FileName = "fruit." + std::to_string(cutID) + ".hdf5";
fruitFile = H5::H5File(FileName, H5F_ACC_RDONLY );
H5::Group group = fruitFile.openGroup("fruit");
H5::DataSet dataset = group.openDataSet("apple");
H5::DataSpace dataspace = dataset.getSpace();
hsize_t naxes[2];
dataspace.getSimpleExtentDims(naxes, NULL);
AppleType = Eigen::MatrixXd::Zero(naxes[1], naxes[0]);
dataset.read(AppleType.data(), H5::PredType::NATIVE_DOUBLE);
GoldenApples = std::vector<int>(naxes[0], 0.);
//need golden apples, which are in pos (4,i) in matrix AppleType
for (int i = 0; i < naxes[0]; i++){
GoldenApples[i] = AppleType(4,i);
}
fruitFile.close();
解决方案
如果您未绑定到特定库,请查看HDFql,因为使用它很容易检查 HDF5 数据集的存在。在 C++ 中使用 HDFql,您的用例可以解决如下:
// check if dataset 'apple' exists in HDF5 file 'fruit.h5'
if (HDFql::execute("SHOW DATASET fruit.h5 apple") == HDFql::Success)
{
std::cout << "Dataset apple exists!" << std::endl;
}
else
{
std::cout << "Dataset apple does not exist!" << std::endl;
}
推荐阅读
- flutter - Flutter - 运行 Flutter 失败,找不到名为“pubspec.yaml”的文件,更新 -(操作系统错误:访问被拒绝。,errno = 5)
- python - 表情符号,当文本文件包含 utf-8 和 utf-16 时编码/解码
- c - __attribute__((constructor)) 它如何改变入口点?
- sql - 仅从 SQL 中删除字符
- php - 如何使用php选择特殊的数组项进行分页?
- sql - PL/SQL 触发器 - 保存更新列的日志,如何设置插入的 PK
- delphi - 动态创建的 FireMonkey TPopupMenu 不弹出
- c++ - 静态 std::stringstream 的 Clang-tidy 警告
- python - 不同大小的列与 kivy
- javascript - 如何从javascript中的其他数组向数组中的对象内的键添加值