如何在HDF5中编写多值数据

时间:2017-03-07 08:41:25

标签: c++ dataset hdf5

我使用HDF5在C ++中工作,我需要帮助来保存多值数据。由于我不完全确定这是否是最佳方法,我想尝试将数据保存为原始数据集中的复合类型(如本答案中所述:https://stackoverflow.com/a/35597759)。

我的代码目前看起来像这样(字符串完全用于测试):

#ifdef WITH_HDF
#include <iostream.h>
#else
#include <iostream>
#endif
#include <string>
#include "H5Cpp.h"

using namespace std;
using namespace H5;

const int LENGTH = 1;
const int RANK = 1; 
const string FILE_NAME = "fhirBASIS.h5";

/**Compound datatype with datatypes*/
struct observation_t
{
    char* status; 
    char* device;
    char* code; 
    char* value; 
    char* system; 
    char* version; 
    int userSelected;
    char* subject;
    char* effectiveDateTime;
};


/*
 * Code start
 */

int main(){

    H5File file("fhirBASIS.h5",H5F_ACC_TRUNC);
    Group grp(file.createGroup("SensoricData"));

    observation_t observation;

    //status string
    std::string dts = "status";
    observation.status = new char[dts.length()];
    observation.status = const_cast<char*> (dts.data());

    //device string
    std::string dtd = "device";
    observation.device = new char[dtd.length()];
    observation.device = const_cast<char*> (dtd.data());

    //code string
    std::string dtc = "code";
    observation.code = new char[dtc.length()];
    observation.code = const_cast<char*> (dtc.data());

    //value string
    std::string dtv = "value";
    observation.value = new char[dtv.length()];
    observation.value = const_cast<char*> (dtv.data());

    //system string
    std::string dtsys = "system";
    observation.system = new char[dtsys.length()];
    observation.system = const_cast<char*> (dtsys.data());

    //version string
    std::string dtver = "version";
    observation.version = new char[dtver.length()];
    observation.version = const_cast<char*> (dtver.data());

    //userSelected bool
    observation.userSelected = 0; 

    //subject string
    std::string dtsub = "subject";
    observation.subject = new char[dtsub.length()];
    observation.subject = const_cast<char*> (dtsub.data());

    //effectiveDateTime string
    std::string dtedt = "effectiveDateTime";
    observation.effectiveDateTime = new char[dtedt.length()];
    observation.effectiveDateTime = const_cast<char*> (dtedt.data());


    // create spatial structure of data
    hsize_t len = LENGTH;
    hsize_t dim[1] = {len};
    DataSpace space(RANK,dim); 

    // write required size char array and declare datatypes
    H5::StrType datatype(H5::PredType::C_S1, H5T_VARIABLE); 
    hid_t strtype = H5Tcopy (H5T_C_S1);
    H5Tset_size (strtype, H5T_VARIABLE);

    //defining the datatype to pass HDF55
    H5::CompType mtype(sizeof(observation_t));
    mtype.insertMember("status", HOFFSET(observation_t, status), datatype);
    mtype.insertMember("device", HOFFSET(observation_t, device), datatype);
    mtype.insertMember("code", HOFFSET(observation_t, code), datatype);
    mtype.insertMember("value", HOFFSET(observation_t, value), datatype);
    mtype.insertMember("system", HOFFSET(observation_t, system), datatype);
    mtype.insertMember("version", HOFFSET(observation_t, version), datatype);
    mtype.insertMember("userSelected", HOFFSET(observation_t, userSelected), PredType::NATIVE_INT);
    mtype.insertMember("subject", HOFFSET(observation_t, subject), datatype);
    mtype.insertMember("effectiveDateTime", HOFFSET(observation_t, effectiveDateTime), datatype);

    DataSet dataset =  grp.createDataSet("Observations",mtype,space);
    dataset.write(&observation,mtype);
    dataset.close();
    space.close();
    mtype.close();
    grp.close();
    file.close();

    return 0; 
} 

我想实现,我可以存储多个值,即数据“状态”。我通过创建复合数据类型并编辑状态值以使用它来尝试此操作。这不起作用,但我不知道如何解决它。感谢任何帮助,提前谢谢!

0 个答案:

没有答案