HDF5 C ++:在复合数据集中写入一个字符串

时间:2017-01-18 09:59:46

标签: c++ hdf5

我正在尝试在HDF5复合数据集中保存C ++数据结构。这些数据结构包含POD类型和std :: string。为了正确处理std :: string,我为每个结构A创建了一个结构CA,用std::string替换每个const char*&#39} }指针将指向std::string保留的内存(由c_str方法返回)。

这样做会导致下面详细说明的一些奇怪结果。我在1.8.13上使用了HDF5版debian Jessie

我试图将我的测试简化为最小化。以下是用于写H5::DataSet的代码(r是HDF5文件的根组):

//! a simple example of C-struct with a string
struct CString
{
  //! pointer to a C-string
  const char* value;
}; // end of struct CString
// compound description
H5::CompType c(sizeof(CString));
c.insertMember("value", HOFFSET(CString,value),H5::PredType::C_S1);
// value to be stored
std::string test = "my test value";
// place holder
CString ctest;
// not working: ctest.value= test.c_str()
ctest.value = strdup(test.c_str());
// data set creation
hsize_t dim[] = {1};
const auto d = r.createDataSet("test",c,DataSpace(1,dim));
d.write(&ctest,c);

重点是我必须复制字符串以获取HDF5文件中的值。否则,我得到了垃圾。

以下是从创建的文件中读取值的代码:

const auto f = File("test.hf5",H5F_ACC_RDONLY);
const auto r = f.getRoot();
// compound description
H5::CompType c(sizeof(CString));
c.insertMember("value", HOFFSET(CString,value),H5::PredType::C_S1);
// value to be read
CString test;
// reading
const auto d = r.openDataSet("test");
d.read(&test,c);
std::cout << test.value << std::endl;

(这里File是H5File类的简单包装器,它提供了getRoot方法)

复制一个字符串,输出是&#34;我的测试值&#34;。 如果没有复制字符串,则输出为&#34; A&#34;。

这种行为似乎与我读到的关于在HDF5中编写/读取std :: string的各种帖子不一致。但是,这些帖子从未处理过复合数据集。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我终于找到了anwswer。我必须更改value成员的定义,如下所示:

H5::CompType c(sizeof(CString));
H5::StrType stype(H5::PredType::C_S1, H5T_VARIABLE);
c.insertMember("value", HOFFSET(CString,value),stype);

复制字符串时该示例有效的事实是某种好运,并且与我的测试的内存布局有关。

此致