【笔记】C++ 读写hdf5文件

【笔记】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()<

你可能感兴趣的:(【笔记】C++ 读写hdf5文件)