我有一个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 ) }
}
复合数据的成员在文件之间可能有所不同,但是我知道LifeState
,CellIdx
,CellID
和AgentID
始终包含在复合数据类型中(即使在同一位置)。
我的应用程序不知道复合数据的确切结构,因此无法定义要在struct
中使用的适当H5Tread()
。
是否有一种方法可以将复合数据数组中的字段AgentID
和CellID
提取到的数组中
struct {
int iAgendID;
int iCellID;
}
即忽略其余字段?
谢谢
答案 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;