hdf5/c++ 中的测试组存在
Posted
技术标签:
【中文标题】hdf5/c++ 中的测试组存在【英文标题】:Test group existence in hdf5/c++ 【发布时间】:2016-06-10 15:11:33 【问题描述】:我正在打开一个现有的 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 例程的假(不存在)返回值抛出异常;所以又是同样的问题。
在这种情况下求助于 C API 是否干净,或者是否有一些函数直接设计用于测试我忽略的 C++ API 中的存在?
【问题讨论】:
看起来与H5Lexists
等效的 C++ 根本不存在。 try ... catch ...
对我来说似乎比 C++ 更像 Python,但我认为或者使用 C API 是你的两个选择。
【参考方案1】:
我正在测试一个组的存在:
bool H5Location::attrExists(const char* name) const;
这样您就可以在指定位置测试组/数据集/…的存在。
// Test if empty (= new) H5 file
auto isNewFile = this->attrExists(VariablesH5GroupName);
【讨论】:
不是 100% 我需要的(我仍然需要检查它是否是一个组而不是其他属性),但看起来已经尽可能好。谢谢! 实际上,这仅在组具有命名属性时才有效,而且情况并非总是如此......所以这不是一个正确的答案,对不起:/ 刚试过;对于普通数据集,即使数据集存在,它也会返回 false。也许在答案本身中更明显地标记它不是正确的。【参考方案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");
【讨论】:
【参考方案3】:由于没有一个解决方案对我有用,所以我做了。
H5:H5File file(filename, H5F_ACC_RWWR);
...
if(file.nameExists(groupname))
return file.openGroup(groupname);
else
return file.createGroup(groupname);
【讨论】:
以上是关于hdf5/c++ 中的测试组存在的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 测试中间件中的 URL 参数 BEFORE 组中间件