2004-02-10 23:42:55 +08:00
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
2007-02-07 22:56:24 +08:00
|
|
|
* Copyright by The HDF Group. *
|
2004-02-10 23:42:55 +08:00
|
|
|
* All rights reserved. *
|
|
|
|
* *
|
|
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
|
|
* terms governing use, modification, and redistribution, is contained in *
|
2017-04-18 03:32:16 +08:00
|
|
|
* the COPYING file, which can be found at the root of the source code *
|
2021-02-17 22:52:36 +08:00
|
|
|
* distribution tree, or in https://www.hdfgroup.org/licenses. *
|
2017-04-18 03:32:16 +08:00
|
|
|
* If you do not have access to either file, you may request a copy from *
|
|
|
|
* help@hdfgroup.org. *
|
2004-02-10 23:42:55 +08:00
|
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
|
2005-08-14 04:53:35 +08:00
|
|
|
/*
|
1998-09-01 05:36:28 +08:00
|
|
|
* This program illustrates the usage of the H5A Interface functions.
|
|
|
|
* It creates and writes a dataset, and then creates and writes array,
|
2005-08-14 04:53:35 +08:00
|
|
|
* scalar, and string attributes of the dataset.
|
1998-09-01 05:36:28 +08:00
|
|
|
* Program reopens the file, attaches to the scalar attribute using
|
|
|
|
* attribute name and reads and displays its value. Then index of the
|
|
|
|
* third attribute is used to read and display attribute values.
|
|
|
|
* The H5Aiterate function is used to iterate through the dataset attributes,
|
2005-08-14 04:53:35 +08:00
|
|
|
* and display their names. The function is also reads and displays the values
|
|
|
|
* of the array attribute.
|
|
|
|
*/
|
|
|
|
|
1998-09-01 11:35:23 +08:00
|
|
|
#include <stdlib.h>
|
2001-04-04 02:33:07 +08:00
|
|
|
|
|
|
|
#include "hdf5.h"
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2001-06-06 02:00:37 +08:00
|
|
|
#define H5FILE_NAME "Attributes.h5"
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
#define RANK 1 /* Rank and size of the dataset */
|
|
|
|
#define SIZE 7
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
#define ARANK 2 /* Rank and dimension sizes of the first dataset attribute */
|
1998-09-01 05:36:28 +08:00
|
|
|
#define ADIM1 2
|
2005-08-14 04:53:35 +08:00
|
|
|
#define ADIM2 3
|
2020-09-30 22:27:10 +08:00
|
|
|
#define ANAME "Float attribute" /* Name of the array attribute */
|
1998-09-01 05:36:28 +08:00
|
|
|
#define ANAMES "Character attribute" /* Name of the string attribute */
|
|
|
|
|
2007-10-04 23:06:28 +08:00
|
|
|
static herr_t attr_info(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *opdata);
|
2020-09-30 22:27:10 +08:00
|
|
|
/* Operator function */
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2005-08-14 04:53:35 +08:00
|
|
|
int
|
2020-09-30 22:27:10 +08:00
|
|
|
main(void)
|
1998-09-01 05:36:28 +08:00
|
|
|
{
|
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
hid_t file, dataset; /* File and dataset identifiers */
|
|
|
|
|
|
|
|
hid_t fid; /* Dataspace identifier */
|
|
|
|
hid_t attr1, attr2, attr3; /* Attribute identifiers */
|
|
|
|
hid_t attr;
|
|
|
|
hid_t aid1, aid2, aid3; /* Attribute dataspace identifiers */
|
|
|
|
hid_t atype, atype_mem; /* Attribute type */
|
|
|
|
H5T_class_t type_class;
|
|
|
|
|
|
|
|
hsize_t fdim[] = {SIZE};
|
|
|
|
hsize_t adim[] = {ADIM1, ADIM2}; /* Dimensions of the first attribute */
|
|
|
|
|
|
|
|
float matrix[ADIM1][ADIM2]; /* Attribute data */
|
|
|
|
|
|
|
|
herr_t ret; /* Return value */
|
|
|
|
H5O_info2_t oinfo; /* Object info */
|
|
|
|
unsigned i, j; /* Counters */
|
|
|
|
char string_out[80]; /* Buffer to read string attribute back */
|
|
|
|
int point_out; /* Buffer to read scalar attribute back */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data initialization.
|
|
|
|
*/
|
|
|
|
int vector[] = {1, 2, 3, 4, 5, 6, 7}; /* Dataset data */
|
|
|
|
int point = 1; /* Value of the scalar attribute */
|
|
|
|
char string[] = "ABCD"; /* Value of the string attribute */
|
|
|
|
|
|
|
|
for (i = 0; i < ADIM1; i++) { /* Values of the array attribute */
|
|
|
|
for (j = 0; j < ADIM2; j++)
|
|
|
|
matrix[i][j] = -1.;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create a file.
|
|
|
|
*/
|
|
|
|
file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create the dataspace for the dataset in the file.
|
|
|
|
*/
|
|
|
|
fid = H5Screate(H5S_SIMPLE);
|
|
|
|
ret = H5Sset_extent_simple(fid, RANK, fdim, NULL);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create the dataset in the file.
|
|
|
|
*/
|
|
|
|
dataset = H5Dcreate2(file, "Dataset", H5T_NATIVE_INT, fid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write data to the dataset.
|
|
|
|
*/
|
|
|
|
ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, vector);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create dataspace for the first attribute.
|
|
|
|
*/
|
|
|
|
aid1 = H5Screate(H5S_SIMPLE);
|
|
|
|
ret = H5Sset_extent_simple(aid1, ARANK, adim, NULL);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create array attribute.
|
|
|
|
*/
|
|
|
|
attr1 = H5Acreate2(dataset, ANAME, H5T_NATIVE_FLOAT, aid1, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write array attribute.
|
|
|
|
*/
|
|
|
|
ret = H5Awrite(attr1, H5T_NATIVE_FLOAT, matrix);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create scalar attribute.
|
|
|
|
*/
|
|
|
|
aid2 = H5Screate(H5S_SCALAR);
|
|
|
|
attr2 = H5Acreate2(dataset, "Integer attribute", H5T_NATIVE_INT, aid2, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write scalar attribute.
|
|
|
|
*/
|
|
|
|
ret = H5Awrite(attr2, H5T_NATIVE_INT, &point);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create string attribute.
|
|
|
|
*/
|
|
|
|
aid3 = H5Screate(H5S_SCALAR);
|
|
|
|
atype = H5Tcopy(H5T_C_S1);
|
|
|
|
H5Tset_size(atype, 5);
|
|
|
|
H5Tset_strpad(atype, H5T_STR_NULLTERM);
|
|
|
|
attr3 = H5Acreate2(dataset, ANAMES, atype, aid3, H5P_DEFAULT, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write string attribute.
|
|
|
|
*/
|
|
|
|
ret = H5Awrite(attr3, atype, string);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Close attribute and file dataspaces, and datatype.
|
|
|
|
*/
|
|
|
|
ret = H5Sclose(aid1);
|
|
|
|
ret = H5Sclose(aid2);
|
|
|
|
ret = H5Sclose(aid3);
|
|
|
|
ret = H5Sclose(fid);
|
|
|
|
ret = H5Tclose(atype);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Close the attributes.
|
|
|
|
*/
|
|
|
|
ret = H5Aclose(attr1);
|
|
|
|
ret = H5Aclose(attr2);
|
|
|
|
ret = H5Aclose(attr3);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Close the dataset.
|
|
|
|
*/
|
|
|
|
ret = H5Dclose(dataset);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Close the file.
|
|
|
|
*/
|
|
|
|
ret = H5Fclose(file);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Reopen the file.
|
|
|
|
*/
|
|
|
|
file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Open the dataset.
|
|
|
|
*/
|
|
|
|
dataset = H5Dopen2(file, "Dataset", H5P_DEFAULT);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Attach to the scalar attribute using attribute name, then read and
|
|
|
|
* display its value.
|
|
|
|
*/
|
|
|
|
attr = H5Aopen(dataset, "Integer attribute", H5P_DEFAULT);
|
|
|
|
ret = H5Aread(attr, H5T_NATIVE_INT, &point_out);
|
|
|
|
printf("The value of the attribute \"Integer attribute\" is %d \n", point_out);
|
|
|
|
ret = H5Aclose(attr);
|
|
|
|
|
2021-01-08 06:16:00 +08:00
|
|
|
//! [H5Oget_info3_snip]
|
2020-12-16 11:18:54 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
/*
|
|
|
|
* Find string attribute by iterating through all attributes
|
|
|
|
*/
|
|
|
|
ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS);
|
|
|
|
for (i = 0; i < (unsigned)oinfo.num_attrs; i++) {
|
|
|
|
attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)i, H5P_DEFAULT,
|
2022-07-27 05:45:46 +08:00
|
|
|
H5P_DEFAULT);
|
2020-09-30 22:27:10 +08:00
|
|
|
atype = H5Aget_type(attr);
|
|
|
|
type_class = H5Tget_class(atype);
|
|
|
|
if (type_class == H5T_STRING) {
|
|
|
|
atype_mem = H5Tget_native_type(atype, H5T_DIR_ASCEND);
|
|
|
|
ret = H5Aread(attr, atype_mem, string_out);
|
|
|
|
printf("Found string attribute; its index is %d , value = %s \n", i, string_out);
|
|
|
|
ret = H5Tclose(atype_mem);
|
|
|
|
}
|
|
|
|
ret = H5Aclose(attr);
|
|
|
|
ret = H5Tclose(atype);
|
2007-02-26 00:46:36 +08:00
|
|
|
}
|
1998-09-02 00:19:23 +08:00
|
|
|
|
2021-01-08 06:16:00 +08:00
|
|
|
//! [H5Oget_info3_snip]
|
2020-09-30 22:27:10 +08:00
|
|
|
/*
|
|
|
|
* Get attribute info using iteration function.
|
|
|
|
*/
|
[svn-r14220] Description:
Change H5Aiterate2 -> H5Aiterate_by_name to be more consistent with
other new API routine names
Re-add H5Aiterate2, to operate on a particular object
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 03:52:05 +08:00
|
|
|
ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_info, NULL);
|
1998-09-02 00:19:23 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
/*
|
|
|
|
* Close the dataset and the file.
|
|
|
|
*/
|
|
|
|
H5Dclose(dataset);
|
|
|
|
H5Fclose(file);
|
1998-09-02 00:19:23 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
return 0;
|
1998-09-01 05:36:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Operator function.
|
|
|
|
*/
|
2007-10-04 23:06:28 +08:00
|
|
|
static herr_t
|
|
|
|
attr_info(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *opdata)
|
1998-09-01 05:36:28 +08:00
|
|
|
{
|
2020-09-30 22:27:10 +08:00
|
|
|
hid_t attr, atype, aspace; /* Attribute, datatype and dataspace identifiers */
|
|
|
|
int rank;
|
2005-08-14 04:53:35 +08:00
|
|
|
hsize_t sdim[64];
|
2020-09-30 22:27:10 +08:00
|
|
|
herr_t ret;
|
|
|
|
int i;
|
|
|
|
size_t npoints; /* Number of elements in the array attribute. */
|
2022-07-27 05:45:46 +08:00
|
|
|
float *float_array; /* Pointer to the array attribute. */
|
2000-11-14 05:06:27 +08:00
|
|
|
|
|
|
|
/* avoid warnings */
|
2021-03-05 05:06:30 +08:00
|
|
|
(void)opdata;
|
2000-11-14 05:06:27 +08:00
|
|
|
|
1998-09-02 00:19:23 +08:00
|
|
|
/*
|
|
|
|
* Open the attribute using its name.
|
2005-08-14 04:53:35 +08:00
|
|
|
*/
|
[svn-r14217] Description:
Change H5Aopen -> H5Aopen_by_name, in order to be more consistent with
other new API routines.
Re-add H5Aopen as a simpler routine, to open attributes on a particular
object. (Much like the old H5Aopen_name routine).
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 00:07:20 +08:00
|
|
|
attr = H5Aopen(loc_id, name, H5P_DEFAULT);
|
1998-09-01 05:36:28 +08:00
|
|
|
|
1998-09-02 00:19:23 +08:00
|
|
|
/*
|
|
|
|
* Display attribute name.
|
|
|
|
*/
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("\nName : %s\n", name);
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2005-08-14 04:53:35 +08:00
|
|
|
/*
|
1998-09-02 00:19:23 +08:00
|
|
|
* Get attribute datatype, dataspace, rank, and dimensions.
|
|
|
|
*/
|
|
|
|
atype = H5Aget_type(attr);
|
1998-09-01 05:36:28 +08:00
|
|
|
aspace = H5Aget_space(attr);
|
2020-09-30 22:27:10 +08:00
|
|
|
rank = H5Sget_simple_extent_ndims(aspace);
|
|
|
|
ret = H5Sget_simple_extent_dims(aspace, sdim, NULL);
|
1998-09-02 00:19:23 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Display rank and dimension sizes for the array attribute.
|
|
|
|
*/
|
1998-09-01 05:36:28 +08:00
|
|
|
|
2020-09-30 22:27:10 +08:00
|
|
|
if (rank > 0) {
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("Rank : %d \n", rank);
|
|
|
|
printf("Dimension sizes : ");
|
2020-09-30 22:27:10 +08:00
|
|
|
for (i = 0; i < rank; i++)
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("%d ", (int)sdim[i]);
|
|
|
|
printf("\n");
|
1998-09-01 05:36:28 +08:00
|
|
|
}
|
|
|
|
|
1998-09-02 00:19:23 +08:00
|
|
|
/*
|
|
|
|
* Read array attribute and display its type and values.
|
|
|
|
*/
|
1998-09-01 05:36:28 +08:00
|
|
|
|
|
|
|
if (H5T_FLOAT == H5Tget_class(atype)) {
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("Type : FLOAT \n");
|
2020-09-30 22:27:10 +08:00
|
|
|
npoints = H5Sget_simple_extent_npoints(aspace);
|
|
|
|
float_array = (float *)malloc(sizeof(float) * (int)npoints);
|
|
|
|
ret = H5Aread(attr, atype, float_array);
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("Values : ");
|
2020-09-30 22:27:10 +08:00
|
|
|
for (i = 0; i < (int)npoints; i++)
|
2007-10-04 23:06:28 +08:00
|
|
|
printf("%f ", float_array[i]);
|
|
|
|
printf("\n");
|
|
|
|
free(float_array);
|
1998-09-01 05:36:28 +08:00
|
|
|
}
|
|
|
|
|
1998-09-02 00:19:23 +08:00
|
|
|
/*
|
|
|
|
* Release all identifiers.
|
|
|
|
*/
|
1998-09-01 05:36:28 +08:00
|
|
|
H5Tclose(atype);
|
|
|
|
H5Sclose(aspace);
|
|
|
|
H5Aclose(attr);
|
1998-09-01 23:07:02 +08:00
|
|
|
|
1998-09-01 05:36:28 +08:00
|
|
|
return 0;
|
|
|
|
}
|