我正在尝试在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的各种帖子不一致。但是,这些帖子从未处理过复合数据集。
非常感谢任何帮助。
答案 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);
复制字符串时该示例有效的事实是某种好运,并且与我的测试的内存布局有关。
此致