我如何才能将compund数据类型的特定字段提取为数组

时间:2019-02-07 12:23:05

标签: c++ c hdf5

我有一个HDF5文件,其中包含(除其他元素外)一系列复合数据,例如:

    DATASET "AgentDataSet" {
        DATATYPE  H5T_COMPOUND {
           H5T_STD_I32LE "LifeState";
           H5T_STD_I32LE "CellIdx";
           H5T_STD_I32LE "CellID";
           H5T_STD_I64LE "AgentID";
           H5T_IEEE_F32LE "BirthTime";
           H5T_STD_U8LE "Gender";
           H5T_IEEE_F32LE "Age";
           H5T_IEEE_F32LE "LastBirth";
        }
        DATASPACE  SIMPLE { ( 2252984 ) / ( 2252984 ) }
}

复合数据的成员在文件之间可能有所不同,但是我知道LifeStateCellIdxCellIDAgentID始终包含在复合数据类型中(即使在同一位置)。

我的应用程序不知道复合数据的确切结构,因此无法定义要在struct中使用的适当H5Tread()

是否有一种方法可以将复合数据数组中的字段AgentIDCellID提取到的数组中

struct {
  int iAgendID;
  int iCellID;   
}

即忽略其余字段?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了如何做: 我定义了这个结构:

struct info_t {
    idtype   m_ulID;
    gridtype m_ulCellID;
};

然后我创建一个对应的HDF5数据类型:

    hid_t hInfoDataType = H5Tcreate (H5T_COMPOUND, sizeof (info_t));

    info_t ii;
    H5Tinsert(hInfoDataType, SPOP_DT_CELL_ID,  HOFFSET(info_t, m_ulCellID), H5T_NATIVE_INT);
    H5Tinsert(hInfoDataType, SPOP_DT_AGENT_ID, HOFFSET(info_t, m_ulID),     INT_NATIVE_LONG);

然后,假设已打开适当的数据空间(hDataSpace),我将读取并使用数据:

    hsize_t dims;
    H5Sget_simple_extent_dims(hDataSpace, &dims, NULL);
    info_t *pInfos = new info_t[dims];

    hid_t hMemSpace = H5Screate_simple (1, &dims, NULL); 
    herr_t status = H5Dread(hDataSet, hAgentDataType, hMemSpace, hDataSpace, H5P_DEFAULT, pInfos);

    for (int i = 0; i < 10; i++) {
        printf("%d; a %ld, c %d\n", i, pInfos[i].m_ulID, pInfos[i].m_ulCellID);
    }
    delete[] pInfos;