summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c++/examples/chunks.cpp379
-rw-r--r--c++/examples/compound.cpp28
-rw-r--r--c++/examples/h5group.cpp333
-rw-r--r--c++/examples/writedata.cpp454
4 files changed, 642 insertions, 552 deletions
diff --git a/c++/examples/chunks.cpp b/c++/examples/chunks.cpp
index 783fffa..471acea 100644
--- a/c++/examples/chunks.cpp
+++ b/c++/examples/chunks.cpp
@@ -14,7 +14,7 @@
/*
* This example shows how to read data from a chunked dataset.
- * We will read from the file created by extend.C
+ * We will read from the file created by extend.cpp
*/
#ifdef OLD_HEADER_FILENAME
@@ -46,191 +46,194 @@ const int RANKC = 1;
int main (void)
{
- hsize_t i, j;
-
- // Try block to detect exceptions raised by any of the calls inside it
- try
- {
- /*
- * Turn off the auto-printing when failure occurs so that we can
- * handle the errors appropriately
- */
- Exception::dontPrint();
-
- /*
- * Open the file and the dataset.
- */
- H5File file( FILE_NAME, H5F_ACC_RDONLY );
- DataSet dataset = file.openDataSet( DATASET_NAME );
-
- /*
- * Get filespace for rank and dimension
- */
- DataSpace filespace = dataset.getSpace();
-
- /*
- * Get number of dimensions in the file dataspace
- */
- int rank = filespace.getSimpleExtentNdims();
-
- /*
- * Get and print the dimension sizes of the file dataspace
- */
- hsize_t dims[2]; // dataset dimensions
- rank = filespace.getSimpleExtentDims( dims );
- cout << "dataset rank = " << rank << ", dimensions "
- << (unsigned long)(dims[0]) << " x " << (unsigned long)(dims[1])
- << endl;
-
- /*
- * Get creation properties list.
- */
- DSetCreatPropList cparms = dataset.getCreatePlist();
-
- /*
- * Check if dataset is chunked.
- */
- hsize_t chunk_dims[2];
- int rank_chunk;
- if( H5D_CHUNKED == cparms.getLayout() )
- {
- /*
- * Get chunking information: rank and dimensions
- */
- rank_chunk = cparms.getChunk( 2, chunk_dims);
- cout << "chunk rank " << rank_chunk << "dimensions "
- << (unsigned long)(chunk_dims[0]) << " x "
- << (unsigned long)(chunk_dims[1]) << endl;
- }
-
- /*
- * Define the memory space to read dataset.
- */
- DataSpace mspace1( RANK, dims );
-
- /*
- * Read dataset back and display.
- */
- int data_out[NX][NY]; // buffer for dataset to be read
- dataset.read( data_out, PredType::NATIVE_INT, mspace1, filespace );
- cout << "\n";
- cout << "Dataset: \n";
- for (j = 0; j < dims[0]; j++)
- {
- for (i = 0; i < dims[1]; i++)
- cout << data_out[j][i] << " ";
- cout << endl;
- }
-
- /*
- * dataset rank 2, dimensions 10 x 5
- * chunk rank 2, dimensions 2 x 5
-
- * Dataset:
- * 1 1 1 3 3
- * 1 1 1 3 3
- * 1 1 1 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- * 2 0 0 0 0
- */
-
- /*
- * Read the third column from the dataset.
- * First define memory dataspace, then define hyperslab
- * and read it into column array.
- */
- hsize_t col_dims[1];
- col_dims[0] = 10;
- DataSpace mspace2( RANKC, col_dims );
-
- /*
- * Define the column (hyperslab) to read.
- */
- hsize_t offset[2] = { 0, 2 };
- hsize_t count[2] = { 10, 1 };
- int column[10]; // buffer for column to be read
-
- filespace.selectHyperslab( H5S_SELECT_SET, count, offset );
- dataset.read( column, PredType::NATIVE_INT, mspace2, filespace );
-
- cout << endl;
- cout << "Third column: " << endl;
- for (i = 0; i < 10; i++)
- cout << column[i] << endl;
-
- /*
- * Third column:
- * 1
- * 1
- * 1
- * 0
- * 0
- * 0
- * 0
- * 0
- * 0
- * 0
- */
-
- /*
- * Define the memory space to read a chunk.
- */
- DataSpace mspace3( rank_chunk, chunk_dims );
-
- /*
- * Define chunk in the file (hyperslab) to read.
- */
- offset[0] = 2;
- offset[1] = 0;
- count[0] = chunk_dims[0];
- count[1] = chunk_dims[1];
- filespace.selectHyperslab( H5S_SELECT_SET, count, offset );
-
- /*
- * Read chunk back and display.
- */
- int chunk_out[2][5]; // buffer for chunk to be read
- dataset.read( chunk_out, PredType::NATIVE_INT, mspace3, filespace );
- cout << endl;
- cout << "Chunk:" << endl;
- for (j = 0; j < chunk_dims[0]; j++)
- {
- for (i = 0; i < chunk_dims[1]; i++)
- cout << chunk_out[j][i] << " ";
- cout << endl;
- }
- /*
- * Chunk:
- * 1 1 1 0 0
- * 2 0 0 0 0
- */
- } // end of try block
-
- // catch failure caused by the H5File operations
- catch( FileIException error )
- {
- error.printError();
- return -1;
- }
-
- // catch failure caused by the DataSet operations
- catch( DataSetIException error )
- {
- error.printError();
- return -1;
- }
-
- // catch failure caused by the DataSpace operations
- catch( DataSpaceIException error )
- {
- error.printError();
- return -1;
- }
-
- return 0;
+ hsize_t i, j;
+
+ // Try block to detect exceptions raised by any of the calls inside it
+ try
+ {
+ /*
+ * Turn off the auto-printing when failure occurs so that we can
+ * handle the errors appropriately
+ */
+ Exception::dontPrint();
+
+ /*
+ * Open the file and the dataset.
+ */
+ H5File file( FILE_NAME, H5F_ACC_RDONLY );
+ DataSet dataset = file.openDataSet( DATASET_NAME );
+
+ /*
+ * Get filespace for rank and dimension
+ */
+ DataSpace filespace = dataset.getSpace();
+
+ /*
+ * Get number of dimensions in the file dataspace
+ */
+ int rank = filespace.getSimpleExtentNdims();
+
+ /*
+ * Get and print the dimension sizes of the file dataspace
+ */
+ hsize_t dims[2]; // dataset dimensions
+ rank = filespace.getSimpleExtentDims( dims );
+ cout << "dataset rank = " << rank << ", dimensions "
+ << (unsigned long)(dims[0]) << " x "
+ << (unsigned long)(dims[1]) << endl;
+
+ /*
+ * Define the memory space to read dataset.
+ */
+ DataSpace mspace1(RANK, dims);
+
+ /*
+ * Read dataset back and display.
+ */
+ int data_out[NX][NY]; // buffer for dataset to be read
+ dataset.read( data_out, PredType::NATIVE_INT, mspace1, filespace );
+
+ cout << "\n";
+ cout << "Dataset: \n";
+ for (j = 0; j < dims[0]; j++)
+ {
+ for (i = 0; i < dims[1]; i++)
+ cout << data_out[j][i] << " ";
+ cout << endl;
+ }
+
+ /*
+ * dataset rank 2, dimensions 10 x 5
+ * chunk rank 2, dimensions 2 x 5
+
+ * Dataset:
+ * 1 1 1 3 3
+ * 1 1 1 3 3
+ * 1 1 1 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ * 2 0 0 0 0
+ */
+
+ /*
+ * Read the third column from the dataset.
+ * First define memory dataspace, then define hyperslab
+ * and read it into column array.
+ */
+ hsize_t col_dims[1];
+ col_dims[0] = 10;
+ DataSpace mspace2( RANKC, col_dims );
+
+ /*
+ * Define the column (hyperslab) to read.
+ */
+ hsize_t offset[2] = { 0, 2 };
+ hsize_t count[2] = { 10, 1 };
+ int column[10]; // buffer for column to be read
+
+ /*
+ * Define hyperslab and read.
+ */
+ filespace.selectHyperslab( H5S_SELECT_SET, count, offset );
+ dataset.read( column, PredType::NATIVE_INT, mspace2, filespace );
+
+ cout << endl;
+ cout << "Third column: " << endl;
+ for (i = 0; i < 10; i++)
+ cout << column[i] << endl;
+
+ /*
+ * Third column:
+ * 1
+ * 1
+ * 1
+ * 0
+ * 0
+ * 0
+ * 0
+ * 0
+ * 0
+ * 0
+ */
+
+ /*
+ * Get creation properties list.
+ */
+ DSetCreatPropList cparms = dataset.getCreatePlist();
+
+ /*
+ * Check if dataset is chunked.
+ */
+ hsize_t chunk_dims[2];
+ int rank_chunk;
+ if( H5D_CHUNKED == cparms.getLayout() )
+ {
+ /*
+ * Get chunking information: rank and dimensions
+ */
+ rank_chunk = cparms.getChunk( 2, chunk_dims);
+ cout << "chunk rank " << rank_chunk << "dimensions "
+ << (unsigned long)(chunk_dims[0]) << " x "
+ << (unsigned long)(chunk_dims[1]) << endl;
+
+ /*
+ * Define the memory space to read a chunk.
+ */
+ DataSpace mspace3( rank_chunk, chunk_dims );
+
+ /*
+ * Define chunk in the file (hyperslab) to read.
+ */
+ offset[0] = 2;
+ offset[1] = 0;
+ count[0] = chunk_dims[0];
+ count[1] = chunk_dims[1];
+ filespace.selectHyperslab( H5S_SELECT_SET, count, offset );
+
+ /*
+ * Read chunk back and display.
+ */
+ int chunk_out[2][5]; // buffer for chunk to be read
+ dataset.read( chunk_out, PredType::NATIVE_INT, mspace3, filespace );
+ cout << endl;
+ cout << "Chunk:" << endl;
+ for (j = 0; j < chunk_dims[0]; j++)
+ {
+ for (i = 0; i < chunk_dims[1]; i++)
+ cout << chunk_out[j][i] << " ";
+ cout << endl;
+ }
+ /*
+ * Chunk:
+ * 1 1 1 0 0
+ * 2 0 0 0 0
+ */
+ }
+ } // end of try block
+
+ // catch failure caused by the H5File operations
+ catch( FileIException error )
+ {
+ error.printError();
+ return -1;
+ }
+
+ // catch failure caused by the DataSet operations
+ catch( DataSetIException error )
+ {
+ error.printError();
+ return -1;
+ }
+
+ // catch failure caused by the DataSpace operations
+ catch( DataSpaceIException error )
+ {
+ error.printError();
+ return -1;
+ }
+ return 0;
}
diff --git a/c++/examples/compound.cpp b/c++/examples/compound.cpp
index de48590..0424ef3 100644
--- a/c++/examples/compound.cpp
+++ b/c++/examples/compound.cpp
@@ -50,7 +50,7 @@ int main(void)
{
/* First structure and dataset*/
typedef struct s1_t {
- int a;
+ int a;
float b;
double c;
} s1_t;
@@ -58,7 +58,7 @@ int main(void)
/* Second structure (subset of s1_t) and dataset*/
typedef struct s2_t {
double c;
- int a;
+ int a;
} s2_t;
// Try block to detect exceptions raised by any of the calls inside it
@@ -67,8 +67,8 @@ int main(void)
/*
* Initialize the data
*/
- int i;
- s1_t s1[LENGTH];
+ int i;
+ s1_t s1[LENGTH];
for (i = 0; i< LENGTH; i++)
{
s1[i].a = i;
@@ -85,7 +85,7 @@ int main(void)
/*
* Create the data space.
*/
- hsize_t dim[] = {LENGTH}; /* Dataspace dimensions */
+ hsize_t dim[] = {LENGTH}; /* Dataspace dimensions */
DataSpace space( RANK, dim );
/*
@@ -105,10 +105,10 @@ int main(void)
* Create the dataset.
*/
DataSet* dataset;
- dataset = new DataSet( file->createDataSet( DATASET_NAME, mtype1, space ));
+ dataset = new DataSet(file->createDataSet(DATASET_NAME, mtype1, space));
/*
- * Wtite data to the dataset;
+ * Write data to the dataset;
*/
dataset->write( s1, mtype1 );
@@ -118,16 +118,6 @@ int main(void)
delete dataset;
delete file;
- // Get the class of the first member in mtype1, then get its type
- H5T_class_t member1_class = mtype1.getMemberClass( 2 );
- if( member1_class == H5T_FLOAT )
- {
- FloatType member2 = mtype1.getMemberFloatType( 2 );
- H5std_string norm_string;
- H5T_norm_t norm = member2.getNorm( norm_string );
- cout << "Normalization type is " << norm_string << endl;
- }
-
/*
* Open the file and the dataset.
*/
@@ -146,7 +136,7 @@ int main(void)
* Read two fields c and a from s1 dataset. Fields in the file
* are found by their names "c_name" and "a_name".
*/
- s2_t s2[LENGTH];
+ s2_t s2[LENGTH];
dataset->read( s2, mtype2 );
/*
@@ -172,7 +162,7 @@ int main(void)
/*
* Read field b from s1 dataset. Field in the file is found by its name.
*/
- float s3[LENGTH]; // Third "structure" - used to read float field of s1)
+ float s3[LENGTH]; // Third "structure" - used to read float field of s1
dataset->read( s3, mtype3 );
/*
diff --git a/c++/examples/h5group.cpp b/c++/examples/h5group.cpp
index 02e3961..d4efdd6 100644
--- a/c++/examples/h5group.cpp
+++ b/c++/examples/h5group.cpp
@@ -1,7 +1,7 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
@@ -41,8 +41,8 @@
using namespace H5;
#endif
-const H5std_string FILE_NAME( "Group.h5" );
-const int RANK = 2;
+const H5std_string FILE_NAME( "Group.h5" );
+const int RANK = 2;
// Operator function
extern "C" herr_t file_info(hid_t loc_id, const char *name, void *opdata);
@@ -53,159 +53,174 @@ int main(void)
hsize_t dims[2];
hsize_t cdims[2];
- // Try block to detect exceptions raised by any of the calls inside it
- try
- {
- /*
- * Turn off the auto-printing when failure occurs so that we can
- * handle the errors appropriately
- */
- Exception::dontPrint();
-
- /*
- * Create the named file, truncating the existing one if any,
- * using default create and access property lists.
- */
- H5File *file = new H5File( FILE_NAME, H5F_ACC_TRUNC );
-
- /*
- * Create a group in the file
- */
- Group* group = new Group( file->createGroup( "/Data" ));
-
- /*
- * Create dataset "Compressed Data" in the group using absolute
- * name. Dataset creation property list is modified to use
- * GZIP compression with the compression effort set to 6.
- * Note that compression can be used only when dataset is chunked.
- */
- dims[0] = 1000;
- dims[1] = 20;
- cdims[0] = 20;
- cdims[1] = 20;
- DataSpace dataspace( RANK, dims ); // create the new dataspace
- // for the dataset
-
- DSetCreatPropList ds_creatplist; // create dataset creation prop list
- ds_creatplist.setChunk( 2, cdims ); // then modify it for compression
- ds_creatplist.setDeflate( 6 );
-
- DataSet* dataset = new DataSet( file->createDataSet( "/Data/Compressed_Data", PredType::NATIVE_INT, dataspace, ds_creatplist ));
-
- /*
- * Close the dataset and the file.
- */
- delete dataset;
- delete group;
- delete file;
-
- /*
- * Now reopen the file and group in the file.
- */
- file = new H5File( FILE_NAME, H5F_ACC_RDWR );
- group = new Group( file->openGroup( "Data" ));
-
- /*
- * Access "Compressed_Data" dataset in the group.
- */
- try { // to determine if the dataset exists in the group
- dataset = new DataSet( group->openDataSet( "Compressed_Data" ));
- }
- catch( GroupIException not_found_error )
- {
- cout << " Dataset is not found." << endl;
- }
- cout << "dataset \"/Data/Compressed_Data\" is open" << endl;
-
- /*
- * Close the dataset.
- */
- delete dataset;
-
- /*
- * Create hard link to the Data group.
- */
- file->link( H5G_LINK_HARD, "Data", "Data_new" );
-
- /*
- * We can access "Compressed_Data" dataset using created
- * hard link "Data_new".
- */
- try { // to determine if the dataset exists in the file
- dataset = new DataSet( file->openDataSet( "/Data_new/Compressed_Data" ));
- }
- catch( FileIException not_found_error )
- {
- cout << " Dataset is not found." << endl;
- }
- cout << "dataset \"/Data_new/Compressed_Data\" is open" << endl;
-
- /*
- * Close the dataset.
- */
- delete dataset;
-
- /*
- * Use iterator to see the names of the objects in the file
- * root directory.
- */
- cout << endl << "Iterating over elements in the file" << endl;
- herr_t idx = H5Giterate(file->getId(), "/", NULL, file_info, NULL);
- cout << endl;
-
- /*
- * Unlink name "Data" and use iterator to see the names
- * of the objects in the file root direvtory.
- */
- cout << "Unlinking..." << endl;
- try { // attempt to unlink the dataset
- file->unlink( "Data" );
- }
- catch( FileIException unlink_error )
- {
- cout << " unlink failed." << endl;
- }
- cout << "\"Data\" is unlinked" << endl;
-
- cout << endl << "Iterating over elements in the file again" << endl;
- idx = H5Giterate(file->getId(), "/", NULL, file_info, NULL);
- cout << endl;
-
- /*
- * Close the file.
- */
- delete file;
-
- } // end of try block
-
- // catch failure caused by the H5File operations
- catch( FileIException error )
- {
- error.printError();
- return -1;
- }
-
- // catch failure caused by the DataSet operations
- catch( DataSetIException error )
- {
- error.printError();
- return -1;
- }
-
- // catch failure caused by the DataSpace operations
- catch( DataSpaceIException error )
- {
- error.printError();
- return -1;
- }
-
- // catch failure caused by the Attribute operations
- catch( AttributeIException error )
- {
- error.printError();
- return -1;
- }
- return 0;
+ // Try block to detect exceptions raised by any of the calls inside it
+ try
+ {
+ /*
+ * Turn off the auto-printing when failure occurs so that we can
+ * handle the errors appropriately
+ */
+ Exception::dontPrint();
+
+ /*
+ * Create the named file, truncating the existing one if any,
+ * using default create and access property lists.
+ */
+ H5File *file = new H5File( FILE_NAME, H5F_ACC_TRUNC );
+
+ /*
+ * Create a group in the file
+ */
+ Group* group = new Group( file->createGroup( "/Data" ));
+
+ /*
+ * Create dataset "Compressed Data" in the group using absolute
+ * name. Dataset creation property list is modified to use
+ * GZIP compression with the compression effort set to 6.
+ * Note that compression can be used only when dataset is chunked.
+ */
+ dims[0] = 1000;
+ dims[1] = 20;
+ cdims[0] = 20;
+ cdims[1] = 20;
+ DataSpace *dataspace = new DataSpace(RANK, dims); // create new dspace
+ DSetCreatPropList ds_creatplist; // create dataset creation prop list
+ ds_creatplist.setChunk( 2, cdims ); // then modify it for compression
+ ds_creatplist.setDeflate( 6 );
+
+ /*
+ * Create the first dataset.
+ */
+ DataSet* dataset = new DataSet(file->createDataSet(
+ "/Data/Compressed_Data", PredType::NATIVE_INT,
+ *dataspace, ds_creatplist ));
+
+ /*
+ * Close the first dataset.
+ */
+ delete dataset;
+ delete dataspace;
+
+ /*
+ * Create the second dataset.
+ */
+ dims[0] = 500;
+ dims[1] = 20;
+ dataspace = new DataSpace(RANK, dims); // create second dspace
+ dataset = new DataSet(file->createDataSet("/Data/Float_Data",
+ PredType::NATIVE_FLOAT, *dataspace));
+
+ delete dataset;
+ delete dataspace;
+ delete group;
+ delete file;
+
+ /*
+ * Now reopen the file and group in the file.
+ */
+ file = new H5File(FILE_NAME, H5F_ACC_RDWR);
+ group = new Group(file->openGroup("Data"));
+
+ /*
+ * Access "Compressed_Data" dataset in the group.
+ */
+ try { // to determine if the dataset exists in the group
+ dataset = new DataSet( group->openDataSet( "Compressed_Data" ));
+ }
+ catch( GroupIException not_found_error ) {
+ cout << " Dataset is not found." << endl;
+ }
+ cout << "dataset \"/Data/Compressed_Data\" is open" << endl;
+
+ /*
+ * Close the dataset.
+ */
+ delete dataset;
+
+ /*
+ * Create hard link to the Data group.
+ */
+ file->link( H5G_LINK_HARD, "Data", "Data_new" );
+
+ /*
+ * We can access "Compressed_Data" dataset using created
+ * hard link "Data_new".
+ */
+ try { // to determine if the dataset exists in the file
+ dataset = new DataSet(file->openDataSet( "/Data_new/Compressed_Data" ));
+ }
+ catch( FileIException not_found_error )
+ {
+ cout << " Dataset is not found." << endl;
+ }
+ cout << "dataset \"/Data_new/Compressed_Data\" is open" << endl;
+
+ /*
+ * Close the dataset.
+ */
+ delete dataset;
+
+ /*
+ * Use iterator to see the names of the objects in the file
+ * root directory.
+ */
+ cout << endl << "Iterating over elements in the file" << endl;
+ herr_t idx = H5Giterate(file->getId(), "/", NULL, file_info, NULL);
+ cout << endl;
+
+ /*
+ * Unlink name "Data" and use iterator to see the names
+ * of the objects in the file root direvtory.
+ */
+ cout << "Unlinking..." << endl;
+ try { // attempt to unlink the dataset
+ file->unlink( "Data" );
+ }
+ catch( FileIException unlink_error )
+ {
+ cout << " unlink failed." << endl;
+ }
+ cout << "\"Data\" is unlinked" << endl;
+
+ cout << endl << "Iterating over elements in the file again" << endl;
+ idx = H5Giterate(file->getId(), "/", NULL, file_info, NULL);
+ cout << endl;
+
+ /*
+ * Close the group and file.
+ */
+ delete group;
+ delete file;
+ } // end of try block
+
+ // catch failure caused by the H5File operations
+ catch( FileIException error )
+ {
+ error.printError();
+ return -1;
+ }
+
+ // catch failure caused by the DataSet operations
+ catch( DataSetIException error )
+ {
+ error.printError();
+ return -1;
+ }
+
+ // catch failure caused by the DataSpace operations
+ catch( DataSpaceIException error )
+ {
+ error.printError();
+ return -1;
+ }
+
+ // catch failure caused by the Attribute operations
+ catch( AttributeIException error )
+ {
+ error.printError();
+ return -1;
+ }
+ return 0;
}
/*
@@ -227,5 +242,5 @@ file_info(hid_t loc_id, const char *name, void *opdata)
H5Gclose(group);
return 0;
- }
+}
diff --git a/c++/examples/writedata.cpp b/c++/examples/writedata.cpp
index 3691f0b..b12e38d 100644
--- a/c++/examples/writedata.cpp
+++ b/c++/examples/writedata.cpp
@@ -1,7 +1,7 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
@@ -48,208 +48,290 @@ const int MSPACE1_DIM = 50; // Dataset size in memory
const int MSPACE2_RANK = 1; // Rank of the second dataset in memory
const int MSPACE2_DIM = 4; // Dataset size in memory
const int FSPACE_RANK = 2; // Dataset rank as it is stored in the file
-const int FSPACE_DIM1 = 8; // Dimension sizes of the dataset as it is...
-const int FSPACE_DIM2 = 12; // ...stored in the file
-const int MSPACE_DIM1 = 8; // We will read dataset back from the file...
-const int MSPACE_DIM2 = 12; // ...to the dataset in memory with these ...
- // ...dataspace parameters
-const int NPOINTS = 4; // Number of points that will be selected...
- // ...and overwritten
+const int FSPACE_DIM1 = 8; // Dimension sizes of the dataset as it is
+const int FSPACE_DIM2 = 12; // stored in the file
+const int MSPACE_RANK = 2; // Rank of the first dataset in memory
+const int MSPACE_DIM1 = 8; // We will read dataset back from the file
+const int MSPACE_DIM2 = 9; // to the dataset in memory with these
+ // dataspace parameters
+const int NPOINTS = 4; // Number of points that will be selected
+ // and overwritten
int main (void)
{
- /*
- * Buffers' initialization.
- */
- int i,j;
- int vector[MSPACE1_DIM];
- vector[0] = vector[MSPACE1_DIM - 1] = -1;
- for (i = 1; i < MSPACE1_DIM - 1; i++)
- vector[i] = i;
-
- int matrix[MSPACE_DIM1][MSPACE_DIM2];
- for (i = 0; i < MSPACE_DIM1; i++)
- {
- for (j = 0; j < MSPACE_DIM2; j++)
- matrix[i][j] = 0;
- }
-
- // Try block to detect exceptions raised by any of the calls inside it
- try
- {
- /*
- * Turn off the auto-printing when failure occurs so that we can
- * handle the errors appropriately
- */
- Exception::dontPrint();
-
- /*
- * Create a file.
- */
- H5File* file = new H5File( FILE_NAME, H5F_ACC_TRUNC );
-
- /*
- * Create dataspace for the dataset in the file.
- */
- hsize_t fdim[] = {FSPACE_DIM1, FSPACE_DIM2}; // dim sizes of ds (on disk)
- DataSpace fspace( FSPACE_RANK, fdim );
-
- /*
- * Create dataset and write it into the file.
- */
- DataSet* dataset = new DataSet(
- file->createDataSet( DATASET_NAME, PredType::NATIVE_INT, fspace ));
- dataset->write( matrix, PredType::NATIVE_INT );
-
- /*
- * Select hyperslab for the dataset in the file, using 3x2 blocks,
- * (4,3) stride and (2,4) count starting at the position (0,1).
- */
- hsize_t start[2]; // Start of hyperslab
- hsize_t stride[2]; // Stride of hyperslab
- hsize_t count[2]; // Block count
- hsize_t block[2]; // Block sizes
- start[0] = 0; start[1] = 1;
- stride[0] = 4; stride[1] = 3;
- count[0] = 2; count[1] = 4;
- block[0] = 3; block[1] = 2;
- fspace.selectHyperslab( H5S_SELECT_SET, count, start, stride, block);
-
- /*
- * Create dataspace for the first dataset.
- */
- hsize_t dim1[] = {MSPACE1_DIM}; /* Dimension size of the first dataset
- (in memory) */
- DataSpace mspace1( MSPACE1_RANK, dim1 );
-
- /*
- * Select hyperslab.
- * We will use 48 elements of the vector buffer starting at the
- * second element. Selected elements are 1 2 3 . . . 48
- */
- start[0] = 1;
- stride[0] = 1;
- count[0] = 48;
- block[0] = 1;
- mspace1.selectHyperslab( H5S_SELECT_SET, count, start, stride, block);
-
- /*
- * Write selection from the vector buffer to the dataset in the file.
- *
- * File dataset should look like this:
- * 0 1 2 0 3 4 0 5 6 0 7 8
- * 0 9 10 0 11 12 0 13 14 0 15 16
- * 0 17 18 0 19 20 0 21 22 0 23 24
- * 0 0 0 0 0 0 0 0 0 0 0 0
- * 0 25 26 0 27 28 0 29 30 0 31 32
- * 0 33 34 0 35 36 0 37 38 0 39 40
- * 0 41 42 0 43 44 0 45 46 0 47 48
- * 0 0 0 0 0 0 0 0 0 0 0 0
- */
- dataset->write( vector, PredType::NATIVE_INT, mspace1, fspace );
-
- /*
- * Reset the selection for the file dataspace fid.
- */
- fspace.selectNone();
-
- /*
- * Create dataspace for the second dataset.
- */
- hsize_t dim2[] = {MSPACE2_DIM}; /* Dimension size of the second dataset
- (in memory */
- DataSpace mspace2( MSPACE2_RANK, dim2 );
-
- /*
- * Select sequence of NPOINTS points in the file dataspace.
- */
- hsize_t coord[NPOINTS][FSPACE_RANK]; /* Array to store selected points
- from the file dataspace */
- coord[0][0] = 0; coord[0][1] = 0;
- coord[1][0] = 3; coord[1][1] = 3;
- coord[2][0] = 3; coord[2][1] = 5;
- coord[3][0] = 5; coord[3][1] = 6;
-
- fspace.selectElements( H5S_SELECT_SET, NPOINTS, (const hsize_t **)coord);
-
- /*
- * Write new selection of points to the dataset.
- */
- int values[] = {53, 59, 61, 67}; /* New values to be written */
- dataset->write( values, PredType::NATIVE_INT, mspace2, fspace );
-
- /*
- * File dataset should look like this:
- * 53 1 2 0 3 4 0 5 6 0 7 8
- * 0 9 10 0 11 12 0 13 14 0 15 16
- * 0 17 18 0 19 20 0 21 22 0 23 24
- * 0 0 0 59 0 61 0 0 0 0 0 0
- * 0 25 26 0 27 28 0 29 30 0 31 32
- * 0 33 34 0 35 36 67 37 38 0 39 40
- * 0 41 42 0 43 44 0 45 46 0 47 48
- * 0 0 0 0 0 0 0 0 0 0 0 0
- *
- */
-
- /*
- * Close the dataset and the file.
- */
- delete dataset;
- delete file;
-
- /*
- * Open the file.
- */
- file = new H5File( FILE_NAME, H5F_ACC_RDONLY );
-
- /*
- * Open the dataset.
- */
- dataset = new DataSet( file->openDataSet( DATASET_NAME ));
-
- /*
- * Read data back to the buffer matrix.
- */
- dataset->read( matrix, PredType::NATIVE_INT );
-
- /*
- * Display the result.
- */
- for (i=0; i < MSPACE_DIM1; i++)
- {
- for(j=0; j < MSPACE_DIM2; j++)
- cout << matrix[i][j] << " ";
- cout << endl;
- }
-
- /*
- * Close the dataset and the file.
- */
- delete dataset;
- delete file;
+ int i,j; // loop indices */
+
+ /*
+ * Try block to detect exceptions raised by any of the calls inside it
+ */
+ try
+ {
+ /*
+ * Turn off the auto-printing when failure occurs so that we can
+ * handle the errors appropriately
+ */
+ Exception::dontPrint();
+
+ /*
+ * Create a file.
+ */
+ H5File* file = new H5File( FILE_NAME, H5F_ACC_TRUNC );
+
+ /*
+ * Create property list for a dataset and set up fill values.
+ */
+ int fillvalue = 0; /* Fill value for the dataset */
+ DSetCreatPropList plist;
+ plist.setFillValue(PredType::NATIVE_INT, &fillvalue);
+
+ /*
+ * Create dataspace for the dataset in the file.
+ */
+ hsize_t fdim[] = {FSPACE_DIM1, FSPACE_DIM2}; // dim sizes of ds (on disk)
+ DataSpace fspace( FSPACE_RANK, fdim );
+
+ /*
+ * Create dataset and write it into the file.
+ */
+ DataSet* dataset = new DataSet(file->createDataSet(
+ DATASET_NAME, PredType::NATIVE_INT, fspace, plist));
+
+ /*
+ * Select hyperslab for the dataset in the file, using 3x2 blocks,
+ * (4,3) stride and (2,4) count starting at the position (0,1).
+ */
+ hsize_t start[2]; // Start of hyperslab
+ hsize_t stride[2]; // Stride of hyperslab
+ hsize_t count[2]; // Block count
+ hsize_t block[2]; // Block sizes
+ start[0] = 0; start[1] = 1;
+ stride[0] = 4; stride[1] = 3;
+ count[0] = 2; count[1] = 4;
+ block[0] = 3; block[1] = 2;
+ fspace.selectHyperslab( H5S_SELECT_SET, count, start, stride, block);
+
+ /*
+ * Create dataspace for the first dataset.
+ */
+ hsize_t dim1[] = {MSPACE1_DIM}; /* Dimension size of the first dataset
+ (in memory) */
+ DataSpace mspace1( MSPACE1_RANK, dim1 );
+
+ /*
+ * Select hyperslab.
+ * We will use 48 elements of the vector buffer starting at the
+ * second element. Selected elements are 1 2 3 . . . 48
+ */
+ start[0] = 1;
+ stride[0] = 1;
+ count[0] = 48;
+ block[0] = 1;
+ mspace1.selectHyperslab( H5S_SELECT_SET, count, start, stride, block);
+
+ /*
+ * Write selection from the vector buffer to the dataset in the file.
+ *
+ * File dataset should look like this:
+ * 0 1 2 0 3 4 0 5 6 0 7 8
+ * 0 9 10 0 11 12 0 13 14 0 15 16
+ * 0 17 18 0 19 20 0 21 22 0 23 24
+ * 0 0 0 0 0 0 0 0 0 0 0 0
+ * 0 25 26 0 27 28 0 29 30 0 31 32
+ * 0 33 34 0 35 36 0 37 38 0 39 40
+ * 0 41 42 0 43 44 0 45 46 0 47 48
+ * 0 0 0 0 0 0 0 0 0 0 0 0
+ */
+ int vector[MSPACE1_DIM]; // vector buffer for dset
+
+ /*
+ * Buffer initialization.
+ */
+ vector[0] = vector[MSPACE1_DIM - 1] = -1;
+ for (i = 1; i < MSPACE1_DIM - 1; i++)
+ vector[i] = i;
+
+ dataset->write( vector, PredType::NATIVE_INT, mspace1, fspace );
+
+ /*
+ * Reset the selection for the file dataspace fid.
+ */
+ fspace.selectNone();
+
+ /*
+ * Create dataspace for the second dataset.
+ */
+ hsize_t dim2[] = {MSPACE2_DIM}; /* Dimension size of the second dataset
+ (in memory */
+ DataSpace mspace2( MSPACE2_RANK, dim2 );
+
+ /*
+ * Select sequence of NPOINTS points in the file dataspace.
+ */
+ hsize_t coord[NPOINTS][FSPACE_RANK]; /* Array to store selected points
+ from the file dataspace */
+ coord[0][0] = 0; coord[0][1] = 0;
+ coord[1][0] = 3; coord[1][1] = 3;
+ coord[2][0] = 3; coord[2][1] = 5;
+ coord[3][0] = 5; coord[3][1] = 6;
+
+ fspace.selectElements( H5S_SELECT_SET, NPOINTS, (const hsize_t **)coord);
+
+ /*
+ * Write new selection of points to the dataset.
+ */
+ int values[] = {53, 59, 61, 67}; /* New values to be written */
+ dataset->write( values, PredType::NATIVE_INT, mspace2, fspace );
+
+ /*
+ * File dataset should look like this:
+ * 53 1 2 0 3 4 0 5 6 0 7 8
+ * 0 9 10 0 11 12 0 13 14 0 15 16
+ * 0 17 18 0 19 20 0 21 22 0 23 24
+ * 0 0 0 59 0 61 0 0 0 0 0 0
+ * 0 25 26 0 27 28 0 29 30 0 31 32
+ * 0 33 34 0 35 36 67 37 38 0 39 40
+ * 0 41 42 0 43 44 0 45 46 0 47 48
+ * 0 0 0 0 0 0 0 0 0 0 0 0
+ *
+ */
+
+ /*
+ * Close the dataset and the file.
+ */
+ delete dataset;
+ delete file;
+
+ /*
+ * Open the file.
+ */
+ file = new H5File( FILE_NAME, H5F_ACC_RDONLY );
+
+ /*
+ * Open the dataset.
+ */
+ dataset = new DataSet( file->openDataSet( DATASET_NAME ));
+
+ /*
+ * Get dataspace of the dataset.
+ */
+ fspace = dataset->getSpace();
+
+ /*
+ * Select first hyperslab for the dataset in the file. The following
+ * elements are selected:
+ * 10 0 11 12
+ * 18 0 19 20
+ * 0 59 0 61
+ *
+ */
+ start[0] = 1; start[1] = 2;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 3; count[1] = 4;
+ fspace.selectHyperslab(H5S_SELECT_SET, count, start, stride, block);
+
+ /*
+ * Add second selected hyperslab to the selection.
+ * The following elements are selected:
+ * 19 20 0 21 22
+ * 0 61 0 0 0
+ * 27 28 0 29 30
+ * 35 36 67 37 38
+ * 43 44 0 45 46
+ * 0 0 0 0 0
+ * Note that two hyperslabs overlap. Common elements are:
+ * 19 20
+ * 0 61
+ */
+ start[0] = 2; start[1] = 4;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 6; count[1] = 5;
+ fspace.selectHyperslab(H5S_SELECT_OR, count, start, stride, block);
+
+ /*
+ * Create memory dataspace.
+ */
+ hsize_t mdim[] = {MSPACE_DIM1, MSPACE_DIM2}; /* Dimension sizes of the
+ dataset in memory when we
+ read selection from the
+ dataset on the disk */
+ DataSpace mspace(MSPACE_RANK, mdim);
+
+ /*
+ * Select two hyperslabs in memory. Hyperslabs has the same
+ * size and shape as the selected hyperslabs for the file dataspace.
+ */
+ start[0] = 0; start[1] = 0;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 3; count[1] = 4;
+ mspace.selectHyperslab(H5S_SELECT_SET, count, start, stride, block);
+ start[0] = 1; start[1] = 2;
+ block[0] = 1; block[1] = 1;
+ stride[0] = 1; stride[1] = 1;
+ count[0] = 6; count[1] = 5;
+ mspace.selectHyperslab(H5S_SELECT_OR, count, start, stride, block);
+
+ /*
+ * Initialize data buffer.
+ */
+ int matrix_out[MSPACE_DIM1][MSPACE_DIM2];
+ for (i = 0; i < MSPACE_DIM1; i++)
+ for (j = 0; j < MSPACE_DIM2; j++)
+ matrix_out[i][j] = 0;
+
+ /*
+ * Read data back to the buffer matrix.
+ */
+ dataset->read(matrix_out, PredType::NATIVE_INT, mspace, fspace);
+
+ /*
+ * Display the result. Memory dataset is:
+ *
+ * 10 0 11 12 0 0 0 0 0
+ * 18 0 19 20 0 21 22 0 0
+ * 0 59 0 61 0 0 0 0 0
+ * 0 0 27 28 0 29 30 0 0
+ * 0 0 35 36 67 37 38 0 0
+ * 0 0 43 44 0 45 46 0 0
+ * 0 0 0 0 0 0 0 0 0
+ * 0 0 0 0 0 0 0 0 0
+ */
+ for (i=0; i < MSPACE_DIM1; i++)
+ {
+ for(j=0; j < MSPACE_DIM2; j++)
+ cout << matrix_out[i][j] << " ";
+ cout << endl;
+ }
+
+ /*
+ * Close the dataset and the file.
+ */
+ delete dataset;
+ delete file;
} // end of try block
// catch failure caused by the H5File operations
catch( FileIException error )
{
- error.printError();
- return -1;
+ error.printError();
+ return -1;
}
// catch failure caused by the DataSet operations
catch( DataSetIException error )
{
- error.printError();
- return -1;
+ error.printError();
+ return -1;
}
// catch failure caused by the DataSpace operations
catch( DataSpaceIException error )
{
- error.printError();
- return -1;
+ error.printError();
+ return -1;
}
return 0;
-
}