[HDF5] 封装了一个简单的C++ HDF5工具库,实现常用数据类型的读写

目录

一.开发环境

二.主要功能

三.文件结构

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

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

六.头文件Hdf5Function.h

七.工具类

八.主函数测试读写功能


本文基于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文件功能实现

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

HDF5-ZhaoDaBaoZzz-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 <iostream>
#include <string>
#include <ctime>
#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

七.工具类

Tools.cpp

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

string getLocalTime(string format)
{
	char char_time[64];
	time_t curr_time = time(NULL);
	tm* time_info = std::localtime(&curr_time);
	if (NULL != time_info)
	{
		strftime(char_time, sizeof(char_time), format.c_str(), time_info);
	}
	else
	{
		strcpy(char_time, "NULL");
	}
	return char_time;
}
string hdf5Filename()
{
	string filename_id = "hdf5.out.";
	string time_stamp = getLocalTime("%Y.%m.%d.%H.%M.%S");
	string filename_m = filename_id + time_stamp + ".h5";
	return filename_m;
}

Tools.h

#include <iostream>
#include <string>
#include <ctime>
#include "hdf5.h"

#ifndef TOOLS_H_
#define TOOLS_H_

using namespace std;

string getLocalTime(string);
string hdf5Filename();

#endif

八.主函数测试读写功能

#include <windows.h>
#include <fstream>
#include "Hdf5Function.h"

int main()
{
	/*测试代码*/
	//一维int
	const int a = 99;
	const int*value1 = &a;
	//一维double
	const double b = 99.99;
	const double* value2 = &b;
	//一维char
	const char* value3 = "abc";
	//二维intle数组
	int value4[5][6];
	int i, j;
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 6; j++)
		{
			value4[i][j] = i + j;
		}
	}
	//二维double数组
	double value5[289][28];
	int i, j;
	for (i = 0; i < 289; i++)
	{
		for (j = 0; j < 28; j++)
		{
			value5[i][j] = 0.1 + i + j;
		}
	}

	//存放读数据的数据结构
	double* result = new double[289 * 28];
	char* result1 = new char[20];

	//同一个文件内写数据
	Hdf5WriteValue write;
	write.CreateNewFile();
	//写一个int数据
	write.CreateDataspace(1, 0, 1);
	write.CreateGroup("groupA");
	write.CreateIntDataset("datasetA");
	write.WriteIntValue(value1);
	//写一个double数据
	write.CreateDoubleDataset("datasetB");
	write.WriteDoubleValue(value2);
	//新建一个group写一个string数据
	write.CreateGroup("groupB");
	write.CreateStringDataspace(value3,1, 0, 1);
	write.CreateStringDataset("datasetC");
	write.WriteStringValue(value3);
	//写一个int二维数组
	write.CreateDataspace(2, 5, 6);
	write.CreateIntDataset("datasetD");
	write.WriteIntValue(value4);
	//写一个double二维数组
	write.CreateDataspace(2, 289, 28);
	write.CreateDoubleDataset("datasetE");
	write.WriteDoubleValue(value5);

	write.CloseFile();

	//读H5或HDF5文件
	Hdf5ReadValue read;
	//读double数据
	char filename[] = "hdf5.h5";
	read.OpenFile(filename);
	read.OpenGroup("groupB");
	read.OpenDataset("datasetE");
	read.ReadDoubleData(result);
	//打印测试
	cout.setf(ios::fixed, ios::floatfield);
	cout.precision(2);
	for (i = 0; i < 8092; i++)
	{
		cout << result[i] << endl;
	}

	//读取字符串数据
	read.OpenGroup("groupB");
	read.OpenDataset("datasetC");
	read.ReadStringData(result1);
	cout << result1 << endl;

	read.CloseFile();
	delete result;
	delete result1;
	system("pause");
	return 0;

}

微信扫码订阅
UP更新不错过~
关注
  • 2
    点赞
  • 3
    收藏 更改收藏夹
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵大宝字

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值