繁体   English   中英

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

[英]Read string in HDF5/C++

我已经在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有点矛盾,HDFView指示尺寸大小为1 ,类型为“字符串,长度=变量”。

这是我读取向量的方式:

#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

我找到了解决方案:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM