读取HDF5 / C ++中的字符串

问题描述 投票:0回答:1

我已经在我的HDF5存档中存储了一个字符串(和一个向量),例如使用Python接口:

import h5py

file = h5py.File("example.h5","w")

file['/path/to/vector'] = [0., 1., 2.]
file['/path/to/string'] = 'test'

现在我想要读取字符串到std::string。我知道如何读取矢量(见下文),但我完全不知道如何读取字符串。特别不明白的是如何分配结果,如:

  • H5Cpp库似乎不使用STL容器,而是使用原始指针,需要预分配。
  • 这与观察结果有些矛盾,HDFView表示尺寸大小为1,类型为“String,length = variable”。

这是我如何阅读矢量:

#include "H5Cpp.h"
#include <vector>
#include <iostream>

int main()
{
  // open file
  H5::H5File fid = H5::H5File("example.h5",H5F_ACC_RDONLY);

  // open dataset
  H5::DataSet   dataset    = fid.openDataSet("/path/to/vector");
  H5::DataSpace dataspace  = dataset.getSpace();
  H5T_class_t   type_class = dataset.getTypeClass();

  // check data type
  if ( type_class != H5T_FLOAT )
    throw std::runtime_error("Unable to read, incorrect data-type");

  // check precision
  // - get storage type
  H5::FloatType datatype = dataset.getFloatType();
  // - get number of bytes
  size_t precision = datatype.getSize();
  // - check precision
  if ( precision != sizeof(double) )
    throw std::runtime_error("Unable to read, incorrect precision");

  // get the size
  // - read rank (a.k.a number of dimensions)
  int rank = dataspace.getSimpleExtentNdims();
  // - allocate
  hsize_t hshape[rank];
  // - read
  dataspace.getSimpleExtentDims(hshape, NULL);
  // - total size
  size_t size = 0;
  for ( int i = 0 ; i < rank ; ++i ) size += static_cast<size_t>(hshape[i]);

  // allocate output
  std::vector<double> data(size);

  // read data
  dataset.read(const_cast<double*>(data.data()), H5::PredType::NATIVE_DOUBLE);

  // print data
  for ( auto &i : data )
    std::cout << i << std::endl;
}

(用h5c++ -std=c++14 so.cpp编译)

python c++ hdf5
1个回答
0
投票

我找到了一个解决方案:

#include "H5Cpp.h"
#include <vector>
#include <iostream>

int main()
{
  // open file
  H5::H5File fid = H5::H5File("example.h5",H5F_ACC_RDONLY);

  // open dataset, get data-type
  H5::DataSet   dataset    = fid.openDataSet("/path/to/string");
  H5::DataSpace dataspace  = dataset.getSpace();
  H5::StrType   datatype   = dataset.getStrType();

  // allocate output
  std::string data;

  // read output
  dataset.read(data, datatype, dataspace);

  std::cout << data << std::endl;
}
© www.soinside.com 2019 - 2024. All rights reserved.