I would like to add a line to the size 1 HDF5 dataset. The following code works to add doubles to the dataset "doubles" in the test-doubles.h5 file, but the segfaults code in the call to dataset.write(str, string_type, mspace, fspace) :
#include "H5Cpp.h" const int RANK = 1; H5::StrType string_type(H5::PredType::C_S1, H5T_VARIABLE); void append_double(H5::DataSet &dataset, double value) { // dataspace hsize_t dims[RANK] = { 1 }; hsize_t maxdims[RANK] = { H5S_UNLIMITED }; H5::DataSpace mspace(RANK, dims, maxdims); H5::DataSpace space = dataset.getSpace(); const hsize_t actual_dim = space.getSimpleExtentNpoints(); // extend the dataset hsize_t new_size[RANK]; new_size[0] = actual_dim + 1; dataset.extend(new_size); // select hyperslab. H5::DataSpace fspace = dataset.getSpace(); hsize_t offset[RANK] = { actual_dim }; hsize_t dims1[RANK] = { 1 }; fspace.selectHyperslab(H5S_SELECT_SET, dims1, offset); dataset.write(&value, H5::PredType::NATIVE_DOUBLE, mspace, fspace); } void append_string(H5::DataSet &dataset, string value) { // dataspace hsize_t dims[RANK] = { 1 }; hsize_t maxdims[RANK] = { H5S_UNLIMITED }; H5::DataSpace mspace(RANK, dims, maxdims); H5::DataSpace space = dataset.getSpace(); const hsize_t actual_dim = space.getSimpleExtentNpoints(); // extend the dataset hsize_t new_size[RANK]; new_size[0] = actual_dim + 1; dataset.extend(new_size); // select hyperslab. H5::DataSpace fspace = dataset.getSpace(); hsize_t offset[RANK] = { actual_dim }; hsize_t dims1[RANK] = { 1 }; fspace.selectHyperslab(H5S_SELECT_SET, dims1, offset); const char *str = value.c_str(); dataset.write(str, string_type, mspace, fspace); } int main(int argc, char *argv[]) { cout << "start" << endl; { H5::H5File h5_file("test-doubles.h5", H5F_ACC_TRUNC); // create data space with unlimited dimensions for doubles hsize_t doubles_dims[RANK] = { 0 }; hsize_t doubles_maxdims[RANK] = { H5S_UNLIMITED }; H5::DataSpace doubles_fspace(RANK, doubles_dims, doubles_maxdims); // enable chunking for this dataset H5::DSetCreatPropList cparms; hsize_t chunk_dims[RANK] = { 1 }; cparms.setChunk(RANK, chunk_dims); // create dataset for doubles: H5::DataSet d_dataset = h5_file.createDataSet("doubles", H5::PredType::NATIVE_DOUBLE, doubles_fspace, cparms); // append values to this dataset: append_double(d_dataset, 1.0); append_double(d_dataset, 2.0); append_double(d_dataset, 3.0); cout << "doubles written." << endl; } { H5::H5File h5_file("test-strings.h5", H5F_ACC_TRUNC); // create data space with unlimited dimensions for strings hsize_t str_dims[RANK] = { 0 }; hsize_t str_maxdims[RANK] = { H5S_UNLIMITED }; H5::DataSpace str_fspace(RANK, str_dims, str_maxdims); // enable chunking for this dataset H5::DSetCreatPropList str_cparms; hsize_t str_chunk_dims[RANK] = { 1 }; str_cparms.setChunk(RANK, str_chunk_dims); // create dataset for doubles: H5::DataSet str_dataset = h5_file.createDataSet("strings", string_type, str_fspace, str_cparms); // append strings to this dataset: append_string(str_dataset, "test1"); append_string(str_dataset, "test2"); append_string(str_dataset, "test3"); cout << "strings written." << endl; } cout << "all done." << endl; return 0; }
Many thanks for your help!