HDF5 C++;:在复合数据集中写入字符串 我试图在HDF5复合数据集中保存C++数据结构。这些数据结构包含POD类型和std::string。为了正确处理std::string,对于每个结构A,我创建了一个结构CA,其中我用一个const char*指针替换每个std::string(通过c_str方法返回)所持有的内存

HDF5 C++;:在复合数据集中写入字符串 我试图在HDF5复合数据集中保存C++数据结构。这些数据结构包含POD类型和std::string。为了正确处理std::string,对于每个结构A,我创建了一个结构CA,其中我用一个const char*指针替换每个std::string(通过c_str方法返回)所持有的内存,c++,hdf5,C++,Hdf5,这样做会导致一些奇怪的结果,详情如下。我在debian Jessie上使用的是HDF5版本1.8.13 我试图把我的测试简化到最低限度。以下是用于写入H5::DataSet(r是HDF5文件的根组)的代码: 关键是我必须复制一个字符串来获取HDF5文件中的值。否则,我会得到垃圾 以下是从创建的文件中读取值的代码: const auto f = File("test.hf5",H5F_ACC_RDONLY); const auto r = f.getRoot(); // compound desc

这样做会导致一些奇怪的结果,详情如下。我在debian Jessie上使用的是HDF5版本
1.8.13

我试图把我的测试简化到最低限度。以下是用于写入
H5::DataSet
r
是HDF5文件的根组)的代码:

关键是我必须复制一个字符串来获取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;
const auto f=文件(“test.hf5”,H5F\u ACC\rdu only);
const auto r=f.getRoot();
//复合描述
H5::复合型c(sizeof(CString));
c、 插入成员(“值”,HOFFSET(CString,value),H5::PredType::c_S1);
//要读取的值
CString试验;
//阅读
const auto d=r.openDataSet(“测试”);
d、 读取(和测试,c);

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

H5::CompType c(sizeof(CString));
H5::StrType stype(H5::PredType::C_S1, H5T_VARIABLE);
c.insertMember("value", HOFFSET(CString,value),stype);
这个例子在复制字符串时起作用的事实是一种幸运,它与我的测试的内存布局有关

问候

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