/*
 *   Create a 1-D dataset and write values to it.
 *   Close all interfaces, re-open and read 3 selected
 *   values from the dataset.
 */

#include <hdf5.h>
#define FILE "1d.h5"

int main() {

   hid_t       file_id, dataset_id, dataspace, memspace;
   hsize_t     dims[1];
   herr_t      status;

   hsize_t     dimsm[1];
   int         i, dset_data[10], rdset_data[10];
   hsize_t     count[1], stride[1], block[1];
   hsize_t    start[1];

   /* Initialize read/write buffers */
   for (i = 0; i < 10; i++)
   {
        dset_data[i] = 10*i;
        rdset_data[i] = 0;
   }

   /* Create a new file using default properties. */
   file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   /* Create the data space for the dataset. */
   dims[0] = 10; 
   dataspace = H5Screate_simple (1, dims, NULL);

   /* Create dataset and write values to it */
   dataset_id = H5Dcreate (file_id, "dset", H5T_STD_I32BE, dataspace, 
                           H5P_DEFAULT);

   status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
                      H5P_DEFAULT, dset_data);

   /* End access to dataset, dataspace and file */
   status = H5Dclose (dataset_id);
   status = H5Sclose (dataspace);
   status = H5Fclose (file_id);

/* 
 *  Read selected datapoints. 
 */

   /* Open the existing file and dataset */
   file_id = H5Fopen (FILE, H5F_ACC_RDWR, H5P_DEFAULT);
   dataset_id = H5Dopen(file_id, "dset");


   /* Read three values back */
   
   dataspace = H5Dget_space (dataset_id);
   start [0] = 1;
   count [0] = 3;
   stride [0] = 2;
   block[0] = 1;
   status = H5Sselect_hyperslab  (dataspace, H5S_SELECT_SET, start, stride,
                                  count, NULL);

   dimsm[0] = 10;
   memspace = H5Screate_simple (1, dimsm, NULL);  
   status = H5Sselect_hyperslab  (memspace, H5S_SELECT_SET, start, stride,
                                  count, NULL);
   
   status = H5Dread (dataset_id, H5T_NATIVE_INT, memspace, dataspace, 
                     H5P_DEFAULT, rdset_data);

   for (i=0; i<10; i++)
      printf (" %i", rdset_data[i]);
   printf ("\n");

   /* Close the dataset, dataspace, memory space, and file. */
   status = H5Dclose (dataset_id);
   status = H5Sclose (memspace);
   status = H5Sclose (dataspace);
   status = H5Fclose(file_id);
}

