/*
 *   Creating an external file.
 */

#include <hdf5.h>
#define FILE "dset.h5"

int main() {

   hid_t       file_id, dataset_id, dataspace_id, plist, plistr;
   hsize_t     dims[2];
   herr_t      status;
   int         i, j, dset_data[4][6], rdset[4][6];
   char        name[30];
   off_t       offset;
   hsize_t     size;

   
   /* Create a new file using default properties. */
   file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   for (i = 0; i < 4; i++)
      for (j = 0; j < 6; j++)
         dset_data[i][j] = i * 6 + j + 1;

   /* Create the data space for the dataset. */
   dims[0] = 4; 
   dims[1] = 6; 
   dataspace_id = H5Screate_simple(2, dims, NULL);

   plist = H5Pcreate (H5P_DATASET_CREATE);
   status = H5Pset_external (plist, "ext1.dat", 0, (hsize_t)(dims[0]*dims[1]*4) );

   dataset_id = H5Dcreate(file_id, "dset", H5T_STD_I32BE, dataspace_id, plist);

   status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
                     dset_data);

   /* End access to the dataset and release resources used by it. */
   status = H5Dclose(dataset_id);
   status = H5Pclose(plist);

   /* Terminate access to the data space. */ 
   status = H5Sclose(dataspace_id);

   /* Close the file. */
   status = H5Fclose(file_id);

   /* Open file and read dataset, then get external file name */

   file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);
   dataset_id = H5Dopen(file_id, "/dset");
   status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
                    rdset);
   printf ("\nData:\n");
   for (i = 0; i < 4; i++)
   {
      for (j = 0; j < 6; j++)
           printf ("%i ", rdset[i][j]);
       printf ("\n");
   }
   printf ("\n");

   /* Get and print the external file name */
   plistr = H5Dget_create_plist (dataset_id);
   status = H5Pget_external (plistr, 0, sizeof (name), name, &offset, &size);
   printf ("\nName of External File: %s\n\n", name);

   status = H5Pclose(plistr);
   status = H5Dclose(dataset_id);
   status = H5Fclose(file_id);
   
}

