I am reading in datasets from a H5 file in Microsoft Visual C++ 2008. Everything works fine for data of type int and double but I run into problems when I come across string
You need to allocate memory for the full strings, the library won't do it for you. You should replace
char *buffer1[18];
by
char buffer1[18][24];
and
datasetCurveNames.read(&buffer1, strdatatype);
should be
datasetCurveNames.read(buffer1, strdatatype);
(no &
)
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);
Checkout https://github.com/opentradesolutions/openalpha/blob/hdf5/src/openalpha/data.cc for full example
The HDF5 C++ API is woefully under-documented. This is how I read in strings from a dataset. I only figured this out with the help of a code-completion 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);