基于C++与VS2012的HDF5文件处理(二)

基于C++与VS2012的HDF5文件处理(二)

例程学习:三维矩阵读写

  1 /************************************************************
  2 
  3   This example shows how to read and write array datatypes
  4   to a dataset.  The program first writes integers arrays of
  5   dimension ADIM0xADIM1 to a dataset with a dataspace of
  6   DIM0, then closes the  file.  Next, it reopens the file,
  7   reads back the data, and outputs it to the screen.
  8 
  9   This file is intended for use with HDF5 Library version 1.8
 10 
 11  ************************************************************/
 12 
 13 #include "hdf5.h"
 14 #include <stdio.h>
 15 #include <stdlib.h>
 16 
 17 #define FILE            "h5ex_t_array.h5"
 18 #define DATASET         "DS1"
 19 #define DIM0            4
 20 #define ADIM0           3
 21 #define ADIM1           5
 22 
 23 int
 24 main (void)
 25 {
 26     hid_t       file, filetype, memtype, space, dset;
 27                                                 /* Handles */
 28     herr_t      status;
 29     hsize_t     dims[1] = {DIM0},
 30                 adims[2] = {ADIM0, ADIM1};
 31     int         wdata[DIM0][ADIM0][ADIM1],      /* Write buffer */
 32                 ***rdata,                       /* Read buffer */
 33                 ndims;
 34     hsize_t     i, j, k;
 35 
 36     /*
 37      * Initialize data.  i is the element in the dataspace, j and k the
 38      * elements within the array datatype.
 39      */
 40     for (i=0; i<DIM0; i++)
 41         for (j=0; j<ADIM0; j++)
 42             for (k=0; k<ADIM1; k++)
 43                 wdata[i][j][k] = i * j - j * k + i * k;
 44 
 45     /*
 46      * Create a new file using the default properties.
 47      */
 48     file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
 49 
 50     /*
 51      * Create array datatypes for file and memory.
 52      */
 53     filetype = H5Tarray_create (H5T_STD_I64LE, 2, adims);
 54     memtype = H5Tarray_create (H5T_NATIVE_INT, 2, adims);
 55 
 56     /*
 57      * Create dataspace.  Setting maximum size to NULL sets the maximum
 58      * size to be the current size.
 59      */
 60     space = H5Screate_simple (1, dims, NULL);
 61 
 62     /*
 63      * Create the dataset and write the array data to it.
 64      */
 65     dset = H5Dcreate (file, DATASET, filetype, space, H5P_DEFAULT, H5P_DEFAULT,
 66                 H5P_DEFAULT);
 67     status = H5Dwrite (dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT,
 68                 wdata[0][0]);
 69 
 70     /*
 71      * Close and release resources.
 72      */
 73     status = H5Dclose (dset);
 74     status = H5Sclose (space);
 75     status = H5Tclose (filetype);
 76     status = H5Tclose (memtype);
 77     status = H5Fclose (file);
 78 
 79 
 80     /*
 81      * Now we begin the read section of this example.  Here we assume
 82      * the dataset and array have the same name and rank, but can have
 83      * any size.  Therefore we must allocate a new array to read in
 84      * data using malloc().
 85      */
 86 
 87     /*
 88      * Open file and dataset.
 89      */
 90     file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
 91     dset = H5Dopen (file, DATASET, H5P_DEFAULT);
 92 
 93     /*
 94      * Get the datatype and its dimensions.
 95      */
 96     filetype = H5Dget_type (dset);
 97     ndims = H5Tget_array_dims (filetype, adims);
 98 
 99     /*
100      * Get dataspace and allocate memory for read buffer.  This is a
101      * three dimensional dataset when the array datatype is included so
102      * the dynamic allocation must be done in steps.
103      */
104     space = H5Dget_space (dset);
105     ndims = H5Sget_simple_extent_dims (space, dims, NULL);
106 
107     /*
108      * Allocate array of pointers to two-dimensional arrays (the
109      * elements of the dataset.
110      */
111     rdata = (int ***) malloc (dims[0] * sizeof (int **));
112 
113     /*
114      * Allocate two dimensional array of pointers to rows in the data
115      * elements.
116      */
117     rdata[0] = (int **) malloc (dims[0] * adims[0] * sizeof (int *));
118 
119     /*
120      * Allocate space for integer data.
121      */
122     rdata[0][0] = (int *) malloc (dims[0] * adims[0] * adims[1] * sizeof (int));
123 
124     /*
125      * Set the members of the pointer arrays allocated above to point
126      * to the correct locations in their respective arrays.
127      */
128     for (i=0; i<dims[0]; i++) {
129         rdata[i] = rdata[0] + i * adims[0];
130         for (j=0; j<adims[0]; j++)
131             rdata[i][j] = rdata[0][0] + (adims[0] * adims[1] * i) +
132                         (adims[1] * j);
133     }
134 
135     /*
136      * Create the memory datatype.
137      */
138     memtype = H5Tarray_create (H5T_NATIVE_INT, 2, adims);
139 
140     /*
141      * Read the data.
142      */
143     status = H5Dread (dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT,
144                 rdata[0][0]);
145 
146     /*
147      * Output the data to the screen.
148      */
149     for (i=0; i<dims[0]; i++) {
150         printf ("%s[%d]:\n", DATASET, i);
151         for (j=0; j<adims[0]; j++) {
152             printf (" [");
153             for (k=0; k<adims[1]; k++)
154                 printf (" %3d", rdata[i][j][k]);
155             printf ("]\n");
156         }
157         printf("\n");
158     }
159 
160     /*
161      * Close and release resources.
162      */
163     free (rdata[0][0]);
164     free (rdata[0]);
165     free (rdata);
166     status = H5Dclose (dset);
167     status = H5Sclose (space);
168     status = H5Tclose (filetype);
169     status = H5Tclose (memtype);
170     status = H5Fclose (file);
171 
172     return 0;
173 }

 

posted @ 2015-07-17 18:58  法师漂流  阅读(3175)  评论(0编辑  收藏  举报