如何在 C++ 中将 stl::string 写入 HDF5 文件

Posted

技术标签:

【中文标题】如何在 C++ 中将 stl::string 写入 HDF5 文件【英文标题】:How to write stl::string to HDF5 file in c++ 【发布时间】:2017-05-20 01:16:43 【问题描述】:

我在 Windows 平台上使用 HDF5 CPP 库。基本上我想将复合数据类型写入包含 std::string 的 H5 文件。

此代码没有给出任何错误,但在写入 H5 文件时它会写入 garbage 值...

各位,任何提示都有帮助...

这是我的代码:-

#include <H5Cpp.h >
#include <vector>
#include <string>
#include <iostream>

using namespace std;
using namespace H5;


/**Compound datatype with STL Datatype*/
struct PostProcessingData

  std::string datatype;
;
void main()

    H5File file("ResultData.h5",H5F_ACC_TRUNC);
    Group grp(file.createGroup("PostProcessing"));

    PostProcessingData data;
    data.datatype = "stress:xx";

    // create spatial structure of data
    hsize_t len = 1;
    hsize_t dim[1] = len;
    int rank = 1;
    DataSpace space(rank,dim); 

    // write required size char array
    hid_t strtype = H5Tcopy (H5T_C_S1);
    H5Tset_size (strtype, H5T_VARIABLE);

    //defining the datatype to pass HDF55
    H5::CompType mtype(sizeof(PostProcessingData));
    mtype.insertMember("Filename", HOFFSET(PostProcessingData, datatype), strtype);


    DataSet dataset =  grp.createDataSet("subc_id2",mtype,space);
    dataset.write(&data,mtype);
    space.close();
    mtype.close();
    dataset.close();
    grp.close();
    file.close();
    exit(0);
 

【问题讨论】:

有谁能帮帮我吗? 【参考方案1】:

我得到了以下解决方法来在 HDF5 中存储一个字符串:- 我必须将 std:: string 转换为 char* 指针。 HDF5 非常适合原始数据类型。

#include "H5Cpp.h"
#include <vector>
#include <string>
#include <iostream>


using namespace std;
using namespace H5;


/**Compound datatype with STL Datatype*/
struct PostProcessingData

    char* datatype;
;

void main()

    H5File file("ResultData.h5",H5F_ACC_TRUNC);
    Group grp(file.createGroup("PostProcessing"));

    PostProcessingData data;
    std::string dt = "stress:xx";
    data.datatype = new char[dt.length()];
    data.datatype = const_cast<char*> (dt.data());

    // create spatial structure of data
    hsize_t len = 1;
    hsize_t dim[1] = len;
    int rank = 1;
    DataSpace space(rank,dim); 

    // write required size char array
    hid_t strtype = H5Tcopy (H5T_C_S1);
    H5Tset_size (strtype, H5T_VARIABLE);

    //defining the datatype to pass HDF55
    H5::CompType mtype(sizeof(PostProcessingData));
    mtype.insertMember("Filename", HOFFSET(PostProcessingData, datatype), strtype);


    DataSet dataset =  grp.createDataSet("subc_id2",mtype,space);
    //While writing data to file it gives following error
    dataset.write(&data,mtype);
    space.close();
    mtype.close();
    dataset.close();
    grp.close();
    file.close();
    exit(0);


这是文件快照:-

【讨论】:

我看到了这篇文章,你不需要做data.datatype = new char[dt.length()];。在您调用 data() 之后,它会返回一个由字符串对象拥有的指针。这会造成内存泄漏。

以上是关于如何在 C++ 中将 stl::string 写入 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将字节写入 ofstream

(C++基础_STL) —— string类的基本应用

(C++基础_STL) —— string类的基本应用

(C++基础_STL) —— string类的基本应用

(C++基础_STL) —— string类的基本应用

在 C++ 中将数据写入由 CFileDialog 创建的 .txt 文件