Go to the previous, next section.
The function ncattget (or NCAGT or NCAGTC for
FORTRAN) gets the value(s) of a netCDF attribute, given its
variable ID and name.
In case of an error, ncattget returns -1; NCAGT returns a
nonzero value in rcode. Possible causes of errors include:
int ncattget(int ncid, int varid, const char* name, void* value);
ncid
ncopen or nccreate.
varid
NC_GLOBAL for a
global attribute.
name
value
ncattinq
first to find out the length of the attribute.
Here is an example using ncattget to determine the values of a
variable attribute named valid_range for a netCDF variable named
rh and a global attribute named title in an existing
netCDF file named `foo.nc'. In this example, it is assumed that
we don't know how many values will be returned, but that we do know the
types of the attributes. Hence, to allocate enough space to store them,
we must first inquire about the length of the attributes.
#include "netcdf.h"
...
int ncid; /* netCDF ID */
int rh_id; /* variable ID */
nc_type vr_type, t_type; /* attribute types */
int vr_len, t_len; /* attribute lengths */
double *vr_val; /* ptr to attribute values */
char *title; /* ptr to attribute values */
extern char *malloc(); /* memory allocator */
...
ncid = ncopen("foo.nc", NC_NOWRITE);
...
rh_id = ncvarid (ncid, "rh");
...
/* find out how much space is needed for attribute values */
ncattinq (ncid, rh_id, "valid_range", &vr_type, &vr_len);
ncattinq (ncid, NC_GLOBAL, "title", &t_type, &t_len);
/* allocate required space before retrieving values */
vr_val = (double *) malloc(vr_len * nctypelen(vr_type));
title = (char *) malloc(t_len * nctypelen(t_type));
/* get attribute values */
ncattget(ncid, rh_id, "valid_range", (void *)vr_val);
ncattget(ncid, NC_GLOBAL, "title", (void *)title);
...
SUBROUTINE NCAGT (INTEGER NCID, INTEGER VARID,
+ CHARACTER*(*) ATTNAM, type VALUES,
+ INTEGER RCODE)
SUBROUTINE NCAGTC (INTEGER NCID, INTEGER VARID,
+ CHARACTER*(*) ATTNAM, CHARACTER*(*) STRING,
+ INTEGER LENSTR, INTEGER RCODE)
There are two FORTRAN subroutines, NCAGT and NCAGTC, for
retrieving attribute values. The first is for attributes of numeric
type, and the second is for attributes of character-string type.
NCID
NCOPN or NCCRE.
VARID
NCGLOBAL for a
global attribute.
ATTNAM
VALUES
NCAINQ
first to find out the length of the attribute. Warning:
neither the compiler nor the netCDF software can detect if the wrong
type of data is used.
STRING
NCAGTC, the character-string value of the attribute.
LENSTR
NCAGTC, the total declared length (in characters) of the
STRING parameter in the caller. Note that this is not
necessarily the same as the value returned by the FORTRAN LEN
function, because an array argument may be provided. NCAGTC will
check to make sure the requested data will fit in LENSTR
characters.
RCODE
Here is an example using NCAGT to determine the values of an
attribute named valid_range for a netCDF variable named rh
and a global attribute named title in an existing netCDF file
named `foo.nc'. In this example, it is assumed that we don't know
how many values will be returned, so we first inquire about the length
of the attributes to make sure we have enough space to store them:
INCLUDE 'netcdf.inc'
...
PARAMETER (MVRLEN=3) ! max number of "valid_range" values
PARAMETER (MTLEN=80) ! max length of "title" attribute
INTEGER NCID, RCODE
INTEGER RHID ! variable ID
INTEGER VRTYPE, TTYPE ! attribute types
INTEGER VRLEN, TLEN ! attribute lengths
DOUBLE PRECISION VRVAL(MVRLEN) ! vr attribute values
CHARACTER*80 TITLE ! title attribute values
...
NCID = NCOPN ('foo.nc', NCWRITE, RCODE)
...
RHID = NCVID (NCID, 'rh', RCODE) ! get ID
...
* find out attribute lengths, to make sure we have enough space
CALL NCAINQ (NCID, RHID, 'valid_range', VRTYPE, VRLEN,
+ RCODE)
CALL NCAINQ (NCID, NCGLOBAL, 'title', TTYPE, TLEN,
+ RCODE)
* get attribute values, if not too big
IF (VRLEN > MVRLEN) THEN
WRITE (*,*) 'valid_range attribute too big!'
CALL EXIT
ELSE
CALL NCAGT (NCID, RHID, 'valid_range', VRVAL, RCODE)
ENDIF
IF (TLEN > MTLEN) THEN
WRITE (*,*) 'title attribute too big!'
CALL EXIT
ELSE
CALL NCAGTC (NCID, NCGLOBAL, 'title', TITLE, MTLEN, RCODE)
ENDIF
Go to the previous, next section.