This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Miki, > To: address@hidden > From: "R. Miki Moore 423-9712" <address@hidden> > Subject: C++ and putting more than one element > Organization: LLNL > Keywords: 199610020509.AA09727 In the above message you wrote: > I am a newbie with netcdf and am grappling with writing a list of > names to a netcdf file. I can't seem to get anything but the first > name into the file. I'd like to write name1, then name2; rather > than concatenate all the names into one lonnnng string and > write the whole thing in one blast..is this possible? Am I somehow > making an error in my parameters to the var->put call? > // > // simple.cc > // miki moore > // 9/96 > // writes string variables > // > > #include <iostream.h> > #include <fstream.h> > #include <stdlib.h> > #include <NetCDF/netcdf.hh> > int main(int argc,char **argv) > { > // create output file > NcFile outfile(argv[1],NcFile::Replace); > > if (! outfile.is_valid()) { > cout << "file not valid: " << argv[1] << endl; > ::exit(1); > } > > NcDim* numObs = outfile.add_dim("numObs",30); > NcDim* strLength = outfile.add_dim("strLen",32); > > NcVar* var = outfile.add_var("stnName", > ncChar, > numObs, > strLength); > > if (var == NULL) { > cout << "failed to add var" << argv[2] << endl; > ::exit(1); > } > > // first string > int length = 30; > char* data = new char[length+1]; > strcpy(data,argv[2]); > > NcBool ncError; > ncError = var->put(data,0,length); You should use an edge-length of `1' in the above rather than `0' for the most slowly varying dimention. > if (! ncError) { cout << "error putting " << endl; ::exit(1); } > > delete data; > > // second string > char* data2 = new char[length+1]; > strcpy(data2,argv[3]); > int record = atoi(argv[4]); At this point, you should use the NcVar member function `set_cur()' to set the start corner for the next string; otherwise, you'll just rewrite the first string. E.g. var->set_cur(1, 0); I'm unsure what the `record' variable is. You use it in the next call as (basically) the number of strings (which I find hard to believe becuse the string buffer is dimensioned only for one). Also, don't you mean to write `data2' rather than `data'. > > ncError = var->put(data,record,length); > if (! ncError) { cout << "error putting " << endl; ::exit(1); } > > delete data2; > } Please let me know if this helps. -------- Steve Emmerson <address@hidden>