NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
I am trying to use ncopen to check whether a file is a netcdf file or not. I was expecting it to return -1 on error and set ncerr to NC_ENOTNC (=19). Unfortunately, there seems to be a bug, in that ncerr is set to NC_NOERR (=0). The workaround is to test ncerr for NC_SYSERR instead (if there wasn't a problem opening the file, then any error arises from the file being of the wrong type). The following program illustrates the problem : --------------------------------------- #include <stdio.h> #include <stdlib.h> #include <netcdf.h> int main(int argc, char *argv[]) { char *file; int cdfid; if (argc!=2) { (void) fprintf(stderr, "Wrong number of arguments.\n"); } file = argv[1]; ncopts = 0; cdfid = ncopen(file, NC_NOWRITE); (void) fprintf(stderr, "File %s: cdfid = %d, ncerr = %d.\n", file, cdfid, (int) ncerr); return EXIT_SUCCESS; } --------------------------------------- The output for a non cdf file is (the above source file, in fact) : File test.c: cdfid = -1, ncerr = 0. The bug seems to arise from NC_new_cdf at the point where xdr_cdf is called. xdr_cdf calls NCadvise if it cannot read the magic number or if it is incorrect, setting ncerr properly. Then NC_new_cdf calls nc_serror which resets ncerr to NC_NOERR since errno is zero. A small bug, perhaps, but one that can lead to some perplexity. BTW, the workaround is perhaps a better solution, since ncopen will return NC_EXDR (without the above bug, that is) when the file is not large enough for the magic number to be read. -- Peter Neelin (neelin@xxxxxxxxxxxxxxxxx) Positron Imaging Laboratories, Montreal Neurological Institute
netcdfgroup
archives: