2

我正在从 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);

在执行时,缓冲区 1 充满了错误的指针。作为替代方案,我尝试使用 H5T_VARIABLE 通过修改来管理可变长度字符串:

 StrType strdatatype(PredType::C_S1, H5T_VARIABLE);

这也失败了。如果有人能对这个问题有所了解,将不胜感激。

干杯,卢卡斯

4

3 回答 3

9

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);
于 2014-05-26T22:21:47.627 回答
0

您需要为完整的字符串分配内存,库不会为您分配内存。你应该更换

char *buffer1[18];

经过

char buffer1[18][24];

datasetCurveNames.read(&buffer1, strdatatype);

应该

datasetCurveNames.read(buffer1, strdatatype);

(没有&

于 2012-12-12T17:44:35.967 回答
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以获取完整示例

于 2019-01-10T05:25:31.133 回答