#ifdef __cplusplus extern "C" { #endif #include "stdafx.h" #include "..\..\hdf5\hdf5\hdf5-1.6.5_PC\src\hdf5.h" #include #include #include #define FILE "matrix.h5" #define DATASETNAME "OBJ" struct obj { double mat[4][4]; int id; }; hid_t CreateObjType() { unsigned int dtsize=sizeof(obj); hsize_t arr_dims[]={4,4}; //!2 dimensional array hid_t matrix= H5Tarray_create (H5T_STD_U32LE, 2, arr_dims, NULL); hid_t objtype=H5Tcreate(H5T_COMPOUND,dtsize); H5Tinsert(objtype,"Matrix",HOFFSET(obj,mat),matrix); H5Tinsert(objtype,"Id",HOFFSET(obj,id),H5T_NATIVE_UINT); return objtype; } herr_t CreateAndInitializeAttribute(hid_t& dataset) { hsize_t dims[1]={1}; hid_t space = H5Screate_simple(1, dims, NULL); unsigned int totalElem=0; hid_t attr = H5Acreate(dataset,"Element Total", H5T_NATIVE_UINT, space, H5P_DEFAULT); herr_t status=H5Awrite(attr, H5T_NATIVE_UINT,&totalElem); H5Aclose(attr); H5Sclose(space); return status; } void CreateDataset(hid_t file_id, char * dataset_name, hid_t datatype) { hsize_t dim[] = {15}; //!Initial dimension of Dataspace hsize_t dims[1]={1}; hsize_t maxdims[] = {H5S_UNLIMITED}; //! to specify maximum dimension hid_t space = H5Screate_simple(1, dim, maxdims); //! rank = 1 and dimension = unlimited hid_t cparms = H5Pcreate (H5P_DATASET_CREATE); //! dataset creation property to enable chunking hsize_t chunkDims[] ={1}; //! chunk dimension is 5 elements H5Pset_chunk ( cparms, 1, chunkDims); H5Pset_deflate( cparms, 8); //! For compression //!Create the dataset with creation params hid_t dataset = H5Dcreate(file_id, dataset_name , datatype, space, cparms); //!Create attribute for total elements CreateAndInitializeAttribute(dataset); H5Sclose(space); H5Pclose(cparms); H5Dclose(dataset); } //!Write Header herr_t WriteObj(hid_t file_id, char* dataset_name , unsigned int id) { herr_t status; //!error status returned by the hdf5 library hsize_t dims[]={1}; //!dimensions for memory dataspace hsize_t offset[]={0}; //!offset for selecting appropriate dataset region unsigned int numOfElements=0; int i,j; hid_t type= CreateObjType(); //! Create simple dataspace with rank = 1 and dimension = 1 hid_t memspace = H5Screate_simple(1, dims, NULL); //!Open the header dataset hid_t dataset_id = H5Dopen(file_id,dataset_name); //! Get the dataspace of the dataset hid_t dspace = H5Dget_space (dataset_id); //!Read the attribute to locate the position for writing hid_t attr=H5Aopen_idx(dataset_id,0); status=H5Aread(attr, H5T_NATIVE_UINT,&numOfElements); offset[0]=offset[0]+(hsize_t)numOfElements; //! Select the dataspace to which the information has to be written status = H5Sselect_elements (dspace, H5S_SELECT_SET, 1, (const hsize_t **)offset); obj s1; //! Write Header s1.id = id; for(i=0; i<4 ; i++) { for(j=0 ; j<4 ; j++) { if(i == j) s1.mat[i][j]=20; else s1.mat[i][j]=0; } } status = H5Dwrite(dataset_id,type,memspace,dspace,H5P_DEFAULT,&s1); if(status >= 0) { //!Update the number of elements written numOfElements=numOfElements+1; status=H5Awrite(attr, H5T_NATIVE_UINT,&numOfElements); } //!close all resources H5Tclose(type); H5Aclose(attr); H5Sclose(dspace); H5Sclose(memspace); H5Dclose(dataset_id); return status; } int main() { hid_t fileid=H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); hid_t type= CreateObjType(); CreateDataset(fileid, DATASETNAME, type); unsigned int id =12; WriteObj(fileid, DATASETNAME, id); H5Fclose(fileid); return 0; }