2、HDF5读char*类型或者string类型数据

一、描述:
从一个.h5格式的文件,把char*或者string类型的数据读取出来存到vector中。

二、环境:
linux下,HDF5版本hdf5-1.10.1.tar.gz。

三、代码测试:

#include <iostream>
#include <vector>
#include <string.h>
#include "H5Fpublic.h"
#include "hdf5.h"
#include "hdf5_hl.h"
using namespace std;

int main(int argc, char *argv[])
{
    const char* readH5File = "testWriteh5String.h5"; // 文件在可执行目录下
    hid_t hdfId = H5Fopen(readH5File, H5F_ACC_RDONLY, H5P_DEFAULT); // hdfId文件句柄
    if(hdfId<0)
        return -1;

    const char *groupName = "/";
    const char *childName = "/ROOTCHILD";
    int ndims = 0;
    herr_t herr;
    int row;
    hid_t groupid = H5Gopen2(hdfId, groupName,H5P_DEFAULT); // 打开文件
    if(groupid<0)
    {
        H5Fclose(hdfId);
        return -2;
    }
    herr=H5LTget_dataset_ndims(groupid,childName,&ndims); // 获得维度
    hsize_t dims[ndims];
    size_t nsz;
    herr=H5LTget_dataset_info(groupid,childName,dims,NULL,&nsz);
    if(herr<0)
    {
        H5Fclose(hdfId);
        return -3;
    }

    if(ndims == 1)
    {
        row = dims[0];
    }

    int size = nsz; // 单个字符串长度
    char *checkedTime = new char[row*size]; // 分配数据总长度空间
    herr= H5LTread_dataset_string(groupid,childName,checkedTime); // 读取char*数据
    if(herr<0)
    {
        H5Fclose(hdfId);
        return -4;
    }

    // 测试只能先读出数据存到char*中,然后一个一个截取在放到vector中才行
    vector<string> dataVector;
    string totalStr = checkedTime;
    for(int i=0;i<row;i++)
    {
        string singleStr = totalStr.substr(i*nsz,nsz);
        dataVector.push_back(singleStr);
    }

    for(auto iter=dataVector.begin(); iter!=dataVector.end(); iter++)
    {
        cout << *iter << endl;
    }
    cout << "read success!" << endl;
    return 0;
}

四、运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/80687086
今日推荐