/***************************************************************** SUBROUTINE FINDCRUISE FINDCRUISE PLACES ALL THE RECORD NUMBERS FOR A USER INPUT CRUISE INTO AN ARRAY FOR USE IN THE MAIN PROGRAM. ******************************************************************/ /***************************************************************** MAKE INC A WRITE2 STRUCTURE (TWO INTEGERS). THE FIRST INTEGER IS THE NUMBER OF PROFILES IN A CRUISE, THE SECOND IS THE LOCATION OF THE RECORD NUMBER FOR THE FIRST PROFILE IN A CRUISE, IN THE PRIMARY FILE. ******************************************************************/ struct write2 inc; findcruise_( int *choice, /* USER INPUT CRUISE NUMBER */ int *nproc, /* NUMBER OF PROFILES FOR THIS CRUISE */ int *icgrid, /* RECORD NUMBERS OF PROFILES FOR THIS CRUISE */ int *fn, /* FILE IDENTIFICATION NUMBER FOR FILE CONTAINING CRUISE NUMBER AND POSITION OF INFORMATION ON CRUISE IN SECONDARY FILE */ int *fn1, /* FILE IDENTIFICATION NUMBER FOR FILE CONTAINING RECORD NUMBERS SORTED BY CRUISE (PRIMARY FILE) */ int *fn2 /* FILE IDENTIFICATION NUMBER FOR FILE CONTAINING NUMBER OF PROFILES FOR A CRUISE AND LOCATION IN PRIMARY FILE OF RECORD NUMBER OF FIRST PROFILE (SECONDARY FILE) */ ) { /**************************************************************** INTERNAL VARIABLES: CNUM - CRUISE NUMBER READ IN FROM INDEX FILE INDEX - ORDER OF CRUISE IN INDEX FILE (ALSO POSITION OF CRUISE INFORMATION IN SECONDARY FILE) ******************************************************************/ int cnum = 0; int index = 0; /***************************************************************** READ THROUGH INDEX FILE UNTIL REQUESTED CRUISE NUMBER IS FOUND ADD ONE TO INDEX FOR EACH CRUISE NUMBER READ IN. ******************************************************************/ fseek( fp[*fn], 0L, SEEK_SET ); while ( cnum != *choice && !feof( fp[*fn] ) ) { fread( &cnum, sizeof( int ), 1, fp[*fn] ); index +=1; } /**************************************************************** IF THE CRUISE NUMBER WAS NOT FOUND, SET NUMBER OF PROFILES TO -1 AND RETURN TO MAIN PROGRAM. *****************************************************************/ if ( feof( fp[*fn] ) ) { *nproc = -1; fseek( fp[*fn], 0L, SEEK_SET ); return; } /**************************************************************** USE INDEX TO GO TO THE CORRECT POSITION IN THE SECONDARY FILE TO READ IN INFORMATION ON THE CRUISE READ IN THE NUMBER OF PROFILES IN THIS CRUISE (INC.NUM) AND THE STARTING POSITION OF PROFILE RECORD NUMBERS (INC.REC). *****************************************************************/ fseek( fp[*fn2], (index-1) * sizeof( struct write2 ), SEEK_SET ); fread( &inc, sizeof( struct write2 ), 1, fp[*fn2] ); /**************************************************************** USE THIS INFORMATION TO SCROLL TO THE PROPER POSITION IN THE PRIMARY FILE AND TO SET THE NUMBER OF PROFILES. *****************************************************************/ fseek( fp[*fn1], inc.rec * sizeof( int ), SEEK_SET ); *nproc = inc.num; /**************************************************************** READ IN THE PROFILE NUMBERS TO ARRAY ICGRID *****************************************************************/ fread( icgrid, sizeof( int ), *nproc, fp[*fn1] ); /*************************************************************** REWIND FILES ****************************************************************/ fseek( fp[*fn], 0L, SEEK_SET ); fseek( fp[*fn1], 0L, SEEK_SET ); fseek( fp[*fn2], 0L, SEEK_SET ); }