一、描述:
从一个.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;
}