 
  
   
    
 
 
The C code is three functions, nc_get_iter(), nc_next_iter(), and nc_free_iter(). These functions are declared in ncdump/nciter.h and implemented in ncdump/nciter.c
Psuedocode for how they're used:
Use nc_get_iter() to get an iterator for my variable While (iterator not done) use nc_next_iter() to get parameters specifying next block of data use a netCDF function to read the specified block do something with the values in that block of data Free the iterator when done with it
C code that adds 1 to every value of a numeric variable of any type:
#include "nciter.h"
 ...
#define BUFSIZ 1000000                 /* size of buffer, in bytes */
double data[BUFSIZ / sizeof(double)];  /* memory buffer for data */
nciter_t *iter;                        /* handle for iteration state */
size_t nvals;                          /* number of values to access */
size_t start[NC_MAX_DIMS], count[NC_MAX_DIMS];
/* get initialized iterator structure for variable varid */
stat = nc_get_iter(ncid, varid, BUFSIZ, &iter);
/* nc_next_iter() initializes start and count on first call,
 * changes start and count to iterate through whole variable on
 * subsequent calls, returns 0 when no data left for this variable. */
while((nvals = nc_next_iter(iter, start, count)) > 0) {
    /* read in a block of data (converting to doubles if necessary) */
    stat = nc_get_vara_double(ncid, varid, start, count, data);
    if(stat != NC_NOERR) err(...);
    /* add 1 to every value */
    for(int i = 0; i < nvals; i++)
        data[i] += 1.0;
    /* now write the changed data back out (converting back if necessary */
    stat = nc_out_vara_double(ncid, varid, start, count, data);
    if(stat != NC_NOERR) err(...);
}
stat = nc_free_iter(iter);  /* free iterator for this variable */