There is a fairly standard collection of methods which can be used to get files for a program, or to save them afterward. The main complication consists of nesting them within the operating system, but naming files and searching for them also requires some attention.
/* - - - - - - - - F I L E A N D D I R E C T O R Y - - - - - - - - */ - setFilename:(const char *)aFilename { if (filename) free(filename); filename = malloc(strlen(aFilename)+1); strcpy(filename, aFilename); [window setTitleAsFilename:aFilename]; return self; } - open:sender { char *types[2] = {"rec",0}; int i, fd; NXStream *theStream; [[OpenPanel new] allowMultipleFiles: NO]; [[OpenPanel new] chooseDirectories: NO]; if ([ [OpenPanel new] runModalForTypes:types]) { [self setFilename: [[OpenPanel new] filename]]; fd = open(filename, O_RDONLY, 06666); theStream = NXOpenFile(fd, NX_READONLY); // NXScanf(theStream,"%s",cstr); i=0; while (NXScanf(theStream,"%c",&cstr[i])!=EOF) i++; phil=strlen(cstr); NXClose(theStream); close(fd); [window setTitleAsFilename: filename]; [window setDocEdited:NO]; [execWin setSel: 0: [execWin textLength]]; [execWin replaceSel: cstr]; [execWin scrollSelToVisible]; [execWin display]; } return self; } - saveAs:sender { id panel; const char *dir; char *file; /* prompt user for the file name and save to that file */ if (filename==0) { /* no filename; set up defaults */ dir = NXHomeDirectory(); file = (char *)[window title]; } else { file=rindex(filename,'/'); if (file) { dir = filename; *file = 0; file++; } else { dir = filename; file = (char *)[window title]; } } panel = [SavePanel new]; [panel setRequiredFileType: ""]; if ([panel runModalForDirectory: dir file: file]) { [self setFilename: [panel filename]]; return [self save: sender]; } return nil; /* didn't save */ } - save:sender { int fd; NXStream *theStream; if (filename==0) return [self saveAs: sender]; [window setTitle: "Saving ..."]; fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 06666); if (fd < 0) { NXRunAlertPanel(0, "Cannot save file: %s",0,0,0,strerror(errno)); return self; } theStream = NXOpenFile(fd, NX_WRITEONLY); [execWin writeText: theStream]; NXClose(theStream); close(fd); [window setTitleAsFilename: filename]; [window setDocEdited:NO]; return self; } - close:sender {const char *fname; int q; if ([window isDocEdited]) // fname=filename ? filename : [sender title]; // if (rindex(fname,'/')) fname = rindex(fname,'/') + 1; q = NXRunAlertPanel( "Save", "Save changes to %s?", "Save", "Don't Save", "Cancel", filename); if (q==1) {if (![self save:nil]) return nil;} if(q==-1) return nil; // [sender setDelegate: nil]; // [proc free]; // [self free]; return self; } - windowWillClose:sender { [self close: self]; printf("windowWillClose\n"); return self; }