hdf5/c++/examples/h5tutr_subset.cpp

169 lines
5.3 KiB
C++
Raw Normal View History

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2019-09-19 01:11:12 +08:00
* Copyright by The HDF Group. *
* 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 COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* This example illustrates how to read/write a subset of data (a slab)
* from/to a dataset in an HDF5 file. It is used in the HDF5 Tutorial.
*/
#include <iostream>
using std::cout;
using std::endl;
#include <string>
#include "H5Cpp.h"
using namespace H5;
2020-09-30 22:27:10 +08:00
const H5std_string FILE_NAME("h5tutr_subset.h5");
const H5std_string DATASET_NAME("IntArray");
2020-09-30 22:27:10 +08:00
const int RANK = 2;
const int DIM0_SUB = 3; // subset dimensions
const int DIM1_SUB = 4;
const int DIM0 = 8; // size of dataset
const int DIM1 = 10;
2020-09-30 22:27:10 +08:00
int
main(void)
{
2020-09-30 22:27:10 +08:00
int i, j;
int data[DIM0][DIM1], sdata[DIM0_SUB][DIM1_SUB], rdata[DIM0][DIM1];
// Try block to detect exceptions raised by any of the calls inside it
2020-09-30 22:27:10 +08:00
try {
2019-09-19 01:11:12 +08:00
// Turn off the auto-printing when failure occurs so that we can
// handle the errors appropriately
Exception::dontPrint();
// ---------------------------------------------------
2020-04-21 07:12:00 +08:00
// Create a new file using the default property lists.
// Then create a dataset and write data to it.
2019-09-19 01:11:12 +08:00
// Close the file and dataset.
// ---------------------------------------------------
2020-04-21 07:12:00 +08:00
2019-09-19 01:11:12 +08:00
H5File file(FILE_NAME, H5F_ACC_TRUNC);
2020-04-21 07:12:00 +08:00
hsize_t dims[2];
2020-09-30 22:27:10 +08:00
dims[0] = DIM0;
dims[1] = DIM1;
DataSpace dataspace = DataSpace(RANK, dims);
2020-09-30 22:27:10 +08:00
DataSet dataset(file.createDataSet(DATASET_NAME, PredType::STD_I32BE, dataspace));
2019-09-19 01:11:12 +08:00
for (j = 0; j < DIM0; j++) {
2020-09-30 22:27:10 +08:00
for (i = 0; i < DIM1; i++)
if (i < (DIM1 / 2))
2019-09-19 01:11:12 +08:00
data[j][i] = 1;
2020-09-30 22:27:10 +08:00
else
2019-09-19 01:11:12 +08:00
data[j][i] = 2;
2020-09-30 22:27:10 +08:00
}
2019-09-19 01:11:12 +08:00
dataset.write(data, PredType::NATIVE_INT);
2019-09-19 01:11:12 +08:00
cout << endl << "Data Written to File:" << endl;
for (j = 0; j < DIM0; j++) {
for (i = 0; i < DIM1; i++)
2020-09-30 22:27:10 +08:00
cout << " " << data[j][i];
2019-09-19 01:11:12 +08:00
cout << endl;
}
2019-09-19 01:11:12 +08:00
dataspace.close();
dataset.close();
file.close();
2019-09-19 01:11:12 +08:00
// ---------------------------------------------------
// Reopen the file and dataset and write a subset of
// values to the dataset.
// ---------------------------------------------------
2019-09-19 01:11:12 +08:00
hsize_t offset[2], count[2], stride[2], block[2];
hsize_t dimsm[2];
2019-09-19 01:11:12 +08:00
file.openFile(FILE_NAME, H5F_ACC_RDWR);
dataset = file.openDataSet(DATASET_NAME);
2020-04-21 07:12:00 +08:00
// Specify size and shape of subset to write.
2019-09-19 01:11:12 +08:00
offset[0] = 1;
offset[1] = 2;
2020-09-30 22:27:10 +08:00
count[0] = DIM0_SUB;
count[1] = DIM1_SUB;
2019-09-19 01:11:12 +08:00
stride[0] = 1;
stride[1] = 1;
2019-09-19 01:11:12 +08:00
block[0] = 1;
block[1] = 1;
2020-04-21 07:12:00 +08:00
2019-09-19 01:11:12 +08:00
// Define Memory Dataspace. Get file dataspace and select
// a subset from the file dataspace.
2019-09-19 01:11:12 +08:00
dimsm[0] = DIM0_SUB;
dimsm[1] = DIM1_SUB;
2019-09-19 01:11:12 +08:00
DataSpace memspace(RANK, dimsm, NULL);
2019-09-19 01:11:12 +08:00
dataspace = dataset.getSpace();
2020-04-21 07:12:00 +08:00
dataspace.selectHyperslab(H5S_SELECT_SET, count, offset, stride, block);
2019-09-19 01:11:12 +08:00
// Write a subset of data to the dataset, then read the
// entire dataset back from the file.
2019-09-19 01:11:12 +08:00
cout << endl << "Write subset to file specifying: " << endl;
cout << " offset=1x2 stride=1x1 count=3x4 block=1x1" << endl;
for (j = 0; j < DIM0_SUB; j++) {
for (i = 0; i < DIM1_SUB; i++)
2020-09-30 22:27:10 +08:00
sdata[j][i] = 5;
2020-04-21 07:12:00 +08:00
}
2019-09-19 01:11:12 +08:00
dataset.write(sdata, PredType::NATIVE_INT, memspace, dataspace);
dataset.read(rdata, PredType::NATIVE_INT);
2019-09-19 01:11:12 +08:00
cout << endl << "Data in File after Subset is Written:" << endl;
for (i = 0; i < DIM0; i++) {
2020-04-21 07:12:00 +08:00
for (j = 0; j < DIM1; j++)
2020-09-30 22:27:10 +08:00
cout << " " << rdata[i][j];
2019-09-19 01:11:12 +08:00
cout << endl;
}
cout << endl;
// It is not necessary to close these objects because close() will
// be called when the object instances are going out of scope.
dataspace.close();
memspace.close();
dataset.close();
file.close();
2020-09-30 22:27:10 +08:00
} // end of try block
// catch failure caused by the H5File operations
2020-09-30 22:27:10 +08:00
catch (FileIException error) {
2019-09-19 01:11:12 +08:00
error.printErrorStack();
return -1;
}
// catch failure caused by the DataSet operations
2020-09-30 22:27:10 +08:00
catch (DataSetIException error) {
2019-09-19 01:11:12 +08:00
error.printErrorStack();
return -1;
}
// catch failure caused by the DataSpace operations
2020-09-30 22:27:10 +08:00
catch (DataSpaceIException error) {
2019-09-19 01:11:12 +08:00
error.printErrorStack();
return -1;
}
2020-09-30 22:27:10 +08:00
return 0; // successfully terminated
}