我正在阅读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);
这也失败了。如果有人能够对这个问题有所了解,那将非常感激。
干杯, 卢卡斯
答案 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以获取完整示例