【笔记】C++ 读写hdf5文件
#ifndef SAVE_HDF5_H
#define SAVE_HDF5_H
#include
#include
#include
#include
using namespace H5;
class Save_hdf5 : public QObject
{
Q_OBJECT
public:
explicit Save_hdf5(QObject *parent = 0);
void save_file(double* data,int row,int col,const char* file_path,const char* db_name);/** 保存为hdf5文件 */
bool read_file(double* &data,int &row,int &col,const char* file_path,const char* db_name);/** 读取出hdf5文件,放入data指向的位置 */
};
#endif // SAVE_HDF5_H
#include "save_hdf5.h"
#include
Save_hdf5::Save_hdf5(QObject *parent) : QObject(parent)
{
}
/**
* @brief Save_hdf5::save_file 将一个一维或者二维数组,保存为一个二维hdf5,注意这个函数只支持保存成一个文件,里面包含一个数据集
* @param data 需要保存数组的起始位置
* @param row 要保存成二维数组的行数
* @param col 要保存成二维数组的列数
* @param file_path 要保存成的hdf5文件的路径,例如"D:\\1file\\data.h5"
* @param db_name 要保存的二维数组的数据集名,例如"data",一个hdf5文件可能包含有多个数据集,这里只支持保存一个
*/
void Save_hdf5::save_file(double* data,int row,int col,const char* file_path,const char* db_name)
{
// 先创建一个文件并写入原始数据集
const int data_rank =2;
hid_t file_id;
file_id = H5Fcreate(file_path, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
hsize_t dims[2];
dims[0] = row;
dims[1] = col;
hid_t dataspace_id, dataset_id;
dataspace_id = H5Screate_simple(data_rank, dims, NULL);
dataset_id = H5Dcreate2(file_id, db_name, H5T_IEEE_F64BE, dataspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
herr_t status;
status = H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
H5P_DEFAULT, data);
status = H5Sclose(dataspace_id);
status = H5Dclose(dataset_id);
status = H5Fclose(file_id);
return ;
}
/**
* @brief Save_hdf5::read_file 读取hdf5文件中的二维数组,到一个一维或者二维数组中,需要知道文件路径和数据集名称
* @param data 一个指针,需要提前开辟好空间,保证大于可能读取出的大小,该函数会把读取出的内容会放到指针指向的内存位置
* @param row 读取出来的行数
* @param col 读取出来的列数
* @param file_path Hdf5文件路径
* @param db_name 数据集名称
* @return
*/
bool Save_hdf5::read_file(double *&data, int &row, int &col, const char *file_path, const char *db_name)
{
// 打开HDF5文件
hid_t file_id;
herr_t status;
file_id = H5Fopen(file_path, H5F_ACC_RDWR, H5P_DEFAULT);
// 创建数据集中的数据本身
hid_t dataset_id; // 数据集本身的id
// dataset_id = H5Dopen(group位置id,
// const char *name, 数据集名
// 数据集访问性质)
dataset_id = H5Dopen(file_id, db_name, H5P_DEFAULT);
// 将数据写入数据集
// herr_t 读取状态 = H5Dread(写入目标数据集id,
// 内存数据类型,
// memory_dataspace_id, 定义内存dataspace和其中的选择
// - H5S_ALL: 文件中dataspace用做内存dataspace,file_dataspace_id中的选择作为内存dataspace的选择
// file_dataspace_id, 定义文件中dataspace的选择
// - H5S_ALL: 文件中datasapce的全部,定义为数据集中dataspace定义的全部维度数据
// 本次IO操作的转换性质,
// const void * buf, 内存中接受数据的位置
status = H5Dread(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
hid_t dspace = H5Dget_space(dataset_id);/** 获取数据集大小信息 */
hsize_t dims[2];
H5Sget_simple_extent_dims(dspace, dims, NULL);
row= dims[0];
col= dims[1];
// 关闭dataset相关对象
status = H5Dclose(dataset_id);
// status = H5Sclose(dataspace_id);
// 关闭文件对象
status = H5Fclose(file_id);
return true;
}
#include
#include "save_hdf5.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Save_hdf5 hdf5_obj;
double signal[4][3];
for(int i = 0;i<4;i++)
{
for(int j = 0;j<3;j++)
{
signal[i][j]=i*j;
}
qDebug()<