封装了一个简单的C++ HDF5工具库,实现常用数据类型的读写
admin
2024-02-25 00:15:03
0次

本文基于HDF5官方库,封装了一个简单的常用数据类型的库,HDF5支持的数据类型很多,其中的功能也很强大,但是日常开发中可能常用的包括int、double、string等数据,所以为了简化官方库的使用,自己弄了个小玩意,水平不足,还请见谅。

一.开发环境

Visual Studio2013+配置HDF5环境,也可以直接源码和HDF5库CMake编译。

如何配置HDF5开发环境请参考我的另一篇文章

如何配置HDF5开发环境

二.主要功能

1.HDF5写int,double,string类型的数据到hdf5文件中;

2.读hdf5文件中int,double,string的数据到程序的数据结构中;

3.写数据生成的hdf5文件名使用当前的时间戳来命名。

三.文件结构

  • Hdf5Function.h
  • Tools.h
  • Hdf5WriteValue.cpp
  • Hdf5ReadValue.cpp
  • Tools.cpp
  • 测试用的主函数main.cpp

四.HDF5写数据到hdf5文件功能实现

创建了类来实现相关功能,完整代码见:

CPlusPlusProjects/HDF5 at master · ZhaoDaBaoZzz/CPlusPlusProjects (github.com)

#include "Tool.h"
#include "Hdf5Function.h"
using namespace std;Hdf5WriteValue::Hdf5WriteValue(){}; //构造函数
Hdf5WriteValue::~Hdf5WriteValue(){};//析构函数/*创建HDF5*/
void Hdf5WriteValue::CreateNewFile()
{this->file=H5Fcreate(hdf5_filename().c_str,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);
//H5F_ACC_TRUNC能覆盖,H5F_ACC_EXCL不能覆盖}/*创建HDF5 String数据维度*/
void Hdf5WriteValue::CreateStringDataspace(const void *data,int rank,int col,int row)
{hsize_t dim[2];dim[0]=row;dim[1]=col;size_t size=sizeof(data)/sizeof(char);this->status=H5Test_size(dtype,size)this->dataspace=H5Screate_simple(rank,dim,NULL);
}/*创建HDF5数据维度*/
void Hdf5WriteValue::CreateDataspace(int rank,int col,int row)
{hsize_t dim[2];dim[0]=row;dim[1]=col;this->dataspace=H5Screate_simple(rank,dim,NULL);
}/*创建group*/
void Hdf5WriteValue::CreateGroup(string groupName)
{this->group=H5Gcreate(this->file,groupName.c_str(),H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
}/*创建dataset,int,double,string*/
void Hdf5WriteValue::CreateIntDataset(string datasetName)
{this->dataset=H5Dcreate2(this->group,datasetNmae.c_str(),H5T_NATIVE_INT,this->dataspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT)
}void Hdf5WriteValue::CreateDoubleDataset(string datasetName)
{this->dataset=H5Dcreate2(this->group,datasetNmae.c_str(),H5T_NATIVE_Double,this->dataspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT)
}void Hdf5WriteValue::CreateStringDataset(string datasetName)
{this->dataset=H5Dcreate2(this->group,datasetNmae.c_str(),this->dtype,this->dataspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT)
}/*写入数据到对应类型的dataset*/
void Hdf5WriteValue::WriteIntValue(const void *data)
{this->status=H5Dwrite(this->dataset,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,data);
}void Hdf5WriteValue::WriteDoubleValue(const void *data)
{this->status=H5Dwrite(this->dataset,H5T_NATIVE_DOUNLE,H5S_ALL,H5S_ALL,H5P_DEFAULT,data);
}void Hdf5WriteValue::WriteStringValue(const void *data)
{this->status=H5Dwrite(this->dataset,this->dtype,H5S_ALL,H5S_ALL,H5P_DEFAULT,data);
}
/*关闭数据及文件,注意关闭顺序*/
void Hdf5WriteValue::CloseFile()
{this->status=H5Dclose(this->dataset);this->status=H5Sclose(this->dataspace);this->status=H5Gclose(this->group);this->status=H5Fclose(this->file);
}

五.HDF5读hdf5文件数据到程序中数据结构功能实现

#include "Tools.h"
#include "Hdf5Function.h"
using namespace std;Hdf5ReadValue::Hdf5ReadValue(){}; //构造函数
Hdf5ReadValue::~Hdf5ReadValue(){};//析构函数/*打开HDF5文件*/
void Hdf5ReadValue::OpenFile(const char* filepath)
{this->file = H5Fopen(filepath, H5F_ACC_RDONLY, H5P_DEFAULT);
}/*打开HDF5文件对应的Group*/
void Hdf5ReadValue::OpenGroup(const char* group)
{this->group = H5Gopen2(this->file, group, H5P_DEFAULT);
}/*打开HDF5文件对应的Dataset*/
void Hdf5ReadValue::OpenDataset(const char* dataset)
{this->dataset = H5Dopen(this->group, dataset, H5P_DEFAULT);
}/*读文件中的各种类型数据int,double,string*/
void Hdf5ReadValue::ReadIntData(void *data)
{this->status = H5Dread(this->OpenDataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
}void Hdf5ReadValue::ReadDoubleData(void *data)
{this->status = H5Dread(this->OpenDataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
}void Hdf5ReadValue::ReadStringData(void *data)
{size_t size = sizeof(data) / sizeof(char);this->status = H5Test_size(dtype, size);this->status = H5Dread(this->OpenDataset, this->dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
}/*关闭数据及文件*/
void Hdf5ReadValue::CloseFile()
{this->status = H5Dclose(this->dataset);this->status = H5Gclose(this->group);this->status = H5Fclose(this->file);
}

六.头文件Hdf5Function.h

#include 
#include 
#include 
#include "hdf5.h"#ifndef HDF5FUNCTION_H_
#define HDF5FUNCTION_H_
using namespace std;//HDF5写功能
class Hdf5WriteValue
{
public:hid_t file, dataset, dataspace, group;herr_t status;hid_t dtype = H5Tcopy(H5T_C_S1);Hdf5WriteValue(){}; //构造函数~Hdf5WriteValue(){};//析构函数void CreateNewFile();void CreateStringDataspace(const void *data, int rank, int col, int row);void CreateDataspace(int rank, int col, int row);void CreateGroup(string groupName);void CreateIntDataset(string datasetName);void CreateDoubleDataset(string datasetName);void CreateStringDataset(string datasetName);void WriteIntValue(const void *data);void WriteDoubleValue(const void *data);void WriteStringValue(const void *data);void CloseFile();
};class Hdf5ReadValue
{
public:hid_t file, dataset, dataspace, group;herr_t status;hid_t dtype = H5Tcopy(H5T_C_S1);Hdf5ReadValue(){}; //构造函数~Hdf5ReadValue(){};//析构函数void OpenFile(const char* filepath);void OpenGroup(const char* group);void OpenDataset(const char* dataset);void ReadIntData(void *data);void ReadDoubleData(void *data);void ReadStringData(void *data);void CloseFile();
};
#endif

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...