character dimensions, attribute lengths

Dave Allured dave.allured at noaa.gov
Wed May 10 11:28:40 MDT 2006


Nan,

On the Unidata website, did you see the section on best practices for 
"Strings and Variables of type char"?  This section is more relevant for 
dealing with arrays of strings, rather than single strings.

http://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#Strings%20and%20Variables%20of%20type%20char

However, your message implies that you are concerned mostly with single 
strings, as attributes.  In my opinion there is a simple and unique best 
practice for handling single attribute strings.

When writing, simply write the string as a character array of the 
desired string length, with no added padding or terminator byte.  This 
is effectively a variable length string in Netcdf.  Most Netcdf software 
and files that I have used recently seem to be consistent with this 
convention.

When reading, follow the reading guidelines under Unidata's best 
practices reference above.  When reading in a language that requires 
preallocated fixed length strings, simply over-allocate the length of 
the receiving string, and add padding on the right, as needed.

You're right, you should not be using formal Netcdf dimensions to store 
attribute lengths.  Netcdf stores the length of each attribute 
separately; this is not to be confused with formal dimensions for data 
arrays.  When reading a Netcdf character attribute, you should usually 
read the length first, then the string itself.  If you are doing dynamic 
allocation, then allocate the memory for the string between the two calls.

For example, in Fortran 90, use these Netcdf library routines:

  nf90_inquire_attribute        ! get length of string
  nf90_get_att                  ! read string

In C:

  nc_inq_att or nc_inq_attlen   /* get length of string */
  nc_get_att_text               /* read string */

For more information and complete examples, see the Netcdf documentation 
for these routines.  HTH.

--Dave

Nan Galbraith wrote:
> Sorry if this has been covered repeatedly, I have searched the unidata 
> site
> and the netcdf users guide and just don't see the issue addressed 
> directly.
> It's a "best practices" question, but is not actually answered in that
> document either.
>
> I'm working on an implementation of NetCDF with a very varied group,
> and the issue of string lengths is a real problem for some of them. 
> All our
> data is numeric;  attributes are often char though.
>
> Some participants use software that requires them to specify string
> lengths for char variables, I assume it's fortran but am not sure. Their
> work-around is to declare these as dimensions in the netcdf file: 
> STRING256,
> STRING64, STRING32,  etc.
>
> This seems like a misuse of the concept of dimensions in netcdf, but I'd
> like to know if it's a widely accepted way to deal with the fact that 
> strings
> don't exist in netcdf.  I'd prefer to deal with the issue in software, 
> and leave
> this out of our specification. It seems ... messy to me, but if it's 
> commonly
> done then I guess I'll stop arguing.
>
> Thanks very much -
> Nan Galbraith
>
> =============================================================================== 
>
> To unsubscribe netcdfgroup, visit:
> http://www.unidata.ucar.edu/mailing-list-delete-form.html
> =============================================================================== 
>
>

==============================================================================
To unsubscribe netcdfgroup, visit:
http://www.unidata.ucar.edu/mailing-list-delete-form.html
==============================================================================



More information about the netcdfgroup mailing list