测试组存在于hdf5 / c ++中

时间:2016-02-27 09:28:59

标签: c++ hdf5

我正在打开一个现有的HDF5文件来追加数据;我想确保名为/A的组存在以供后续访问。我正在寻找一种简单的方法来有条件地创建/A(如果不存在则创建并返回新组,或返回现有组)。一种方法是测试/A存在。我怎样才能有效地做到这一点?

根据API文档,我可以这样做:

H5::H5File h5file(filename,H5F_ACC_RDWR);
H5::H5Group grp;
try{
   grp=h5file.openGroup("A");
} catch(H5::Exception& e){
   /* group does not exists, create it */
   grp=h5file.createGroup("A");
}

但明显的丑陋来自这样一个事实:异常被用来传递信息,这根本不是特例。

H5::CommonFG::getObjinfo,似乎以这样的方式包装H5Gget_objinfo,C例程的false(不存在)返回值抛出异常;所以同样的问题。

在这种情况下求助于C API是否干净,或者是否有一些直接设计用于测试C ++ API存在的功能,我忽略了?

2 个答案:

答案 0 :(得分:2)

根据Yossarian在其评论和in this answer中的建议,您可以使用HDF5 1.8.0+ C-API

bool pathExists(hid_t id, const std::string& path)
{
  return H5Lexists( id, path.c_str(), H5P_DEFAULT ) > 0;
}

H5::H5File h5file(filename,H5F_ACC_RDWR);
H5::H5Group grp;
if (pathExists(h5file.getId(), "A")) 
   grp=h5file.openGroup("A");
else
   grp=h5file.createGroup("A");

答案 1 :(得分:1)

我正在测试组的存在:

bool H5Location::attrExists(const char* name) const;

通过这种方式,您可以在指定位置测试group / dataset / ...的存在。

// Test if empty (= new) H5 file
auto isNewFile = this->attrExists(VariablesH5GroupName);