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 */