HDF5 C++ 无需全局变量获取h5文件所有群组名称的实现方法
解决方法
HDF5的H5Ovisit接口预留了用户自定义数据透传参数,你只需要把目标vector的地址作为最后一个参数传入H5Ovisit,就可以在回调函数中直接操作这个vector,完全不需要全局变量。
修正后的完整代码
// 回调函数最后一个参数是透传的用户数据,注意是void*指针类型 herr_t op_func(hid_t loc_id, const char* name, const H5O_info_t* info, void* opdata) { if(info->type == H5O_TYPE_GROUP) { // 将void*转回vector指针,直接往传入的vector里写数据 auto groupVec = static_cast<std::vector<std::string>*>(opdata); groupVec->push_back(std::string(name)); } // 必须返回0才能继续遍历,返回非0值会中断遍历流程 return 0; } void getGroupNames(hid_t fileId, std::vector<std::string>& someVec) { herr_t status; // 最后一个参数传入目标vector的地址,透传给回调函数 status = H5Ovisit(fileId, H5_INDEX_NAME, H5_ITER_NATIVE, op_func, &someVec); // 无需额外赋值,回调函数已经直接把结果写入someVec了 }
注意事项
- 你原来的回调函数最后一个参数漏了指针标识
*,必须修正为void* opdata才能正常接收透传的地址 - 回调函数必须返回
0,否则HDF5会中断遍历,无法拿到全量的群组名称 - 这种方式是线程安全的,不会出现全局变量带来的并发访问问题
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

