在C ++中从hdf5读取一个字符串

时间:2012-12-11 05:12:13

标签: c++ hdf5

我正在阅读Microsoft Visual C ++ 2008中的H5文件中的数据集。对于int和double类型的数据,一切正常,但遇到字符串时遇到问题。在H5文件中,我有18个字符串,每个字符串都是固定长度24.我的代码如下;

StrType strdatatype(PredType::C_S1, 24);
char *buffer1[18];
DataSet datasetCurveNames = riskFactorsH5.openDataSet("/gstrCurveNames");

datasetCurveNames.read(&buffer1, strdatatype);

执行时,buffer1充满了错误的指针。作为替代方案,我尝试使用H5T_VARIABLE来管理变量长度字符串:

 StrType strdatatype(PredType::C_S1, H5T_VARIABLE);

这也失败了。如果有人能够对这个问题有所了解,那将非常感激。

干杯, 卢卡斯

3 个答案:

答案 0 :(得分:6)

HDF5 C ++ API严重缺乏记录。这是我从数据集中读取字符串的方式。我只是在代码完成IDE的帮助下解决了这个问题:

using namespace H5;
std::string field_name("name of the field");
StrType datatype(0, H5T_VARIABLE);
DataSpace dataspace(H5S_SCALAR);
DataSet datset = group.openDataSet(field_name);

std::string field_value;
datset.read(field_value, datatype, dataspace);

答案 1 :(得分:0)

您需要为完整字符串分配内存,库不会为您执行此操作。你应该替换

char *buffer1[18];

通过

char buffer1[18][24];

datasetCurveNames.read(&buffer1, strdatatype);

应该是

datasetCurveNames.read(buffer1, strdatatype);

(没有&

答案 2 :(得分:0)

    auto dataset = file.openDataSet(kDatasetName);
    auto dataspace = dataset.getSpace();
    hsize_t dims_out[2];
    auto ndims = dataspace.getSimpleExtentDims(dims_out, nullptr);
    assert(ndims == 2);
    auto n = dims_out[0] * dims_out[1];
    auto data_type = dataset.getDataType();
    auto type_class = data_type.getClass();
    auto data_size = data_type.getSize();
    void* out = new char[n * data_size]();
    dataset.read(out, data_type);
    if (type_class == H5T_INTEGER) {
    } else if (type_class == H5T_STRING) {
      std::string* strs = new std::string[n];
      for (auto i = 0u; i < n; ++i) {
        auto len = data_size;
        auto c_str = out + data_size * i;
        for (auto p = c_str + len - 1; p != c_str && !*p; --p) --len;
        strs[i].assign(c_str, len);
      }
    }
    free(out);

检出https://github.com/opentradesolutions/openalpha/blob/hdf5/src/openalpha/data.cc以获取完整示例