To still receiving newsletters from us please subscribe to our Newsletters:http://tech.groups.yahoo.com/group/developers-Heaven/
// Student_vector.cpp // this version 2011-07-29 //// A simple example of processing Student records ...// using a C++ STL vector container to hold each 'Student' object// See MENU below to see what this program does ...// Note:// * this program allows only unique student id's for each record// * this program is set to update its file, (if there were any changes),// before quitting#include <iostream>#include <iomanip> // re. setw(widthValue) stream manipulator#include <fstream> // re. ostream, ofstream, ifstream objects#include <sstream> // re. ostringstream object#include <string>#include <vector>#include <algorithm>#include <cctype> // re. tolower/toupper for case insensitive comparison// Globals ...using namespace std;const char THIS_TERM[] = "fall.txt"; // file name for this term's recordsconst string MENU = "\n" " 1. V iew all records in memory at present\n" " 2. A dd a new student name and id\n" " 3. S ort student records\n" " 4. E dit/E rase a student record\n" " 5. L oad in student records from file\n" " 6. U pdate file with records currently in memory\n" " 7. e X it program\n\n" "Your choice (1..7) : ";class Student{public: // Note: this name comparison is case insensitive ... friend bool compare_nocaseName( const Student&, const Student& ); friend bool compare_id( const Student& a, const Student& b ) ; friend ostream& operator << ( ostream& os, const Student& s ) { return os << s.name << ", " << s.id; } // constructors ... Student() {} // default ctor ... Student( string nam, string num ) : name( nam ), id( num ) {} // setters ... void set_name( string nam ){ name = nam; } void set_id( string num ) { id = num; } // getters ... string get_name() const { return name; } string get_id() const { return id; }private: string name, // add any needed info here, just like in a C/C++ 'struct' id;};bool compare_id( const Student& a, const Student& b ){ return a.id < b.id; }// this name comparison (friend function) is NOT case sensitive ...bool compare_nocaseName( const Student& a, const Student& b ){ size_t i = 0, lenNameA = a.name.length(), lenNameB = b.name.length(); while( i < lenNameA && i < lenNameB && tolower(a.name[i]) == tolower(b.name[i]) ) ++i ; // ok ... now check end conditions ... if( i < lenNameA ) { if( i < lenNameB ) return tolower(a.name[i]) < tolower(b.name[i]) ; else return false; // since i == lenNameB } // if reach here ... i == lenNameA ... so check ... if( i < lenNameB ) return true; // since i == lenNameA // else we have i == lenNameA && i == lenNameB ... so names equal return a.id < b.id;}// functions used by main to process a vector of Student recordsint getReply( const string& msg );void pauseForEnter();// returns a valid iterator if ID is used already ... otherwise returns 'end()'vector< Student >::iterator existID( vector< Student >& term, const string& ID );// adds Student records to end of vector of Student records ... 'term'// gets input from keyboard ...int newStud( vector< Student >& term );// shows (to console screen) all student records in vector container ... 'term'void viewStuds( const vector< Student >& term );// file all records in memory ... create/overwrite file with name 'THIS_TERM'int fileStuds( const vector< Student >& term );// reads in all Student records from file 'THIS_TERM' ... if it exists// returns -1 if no file exists; else returns the number of records readint readStuds( vector< Student >& term );// returns 'true' if a record was edited or erased; otherwise returns falsebool editStud( vector< Student > &term );int main() ////////////////////////// BEGIN MAIN ///////////////////////////////{ // create a 'fall vector' to hold student names and ids for the 'Fall Term' // also holds number of records, via 'fall.size()' vector < Student > fall; // now get all records from file ... if it exists ? int count = readStuds( fall ); if( count >= 0 ) cout << count << " student record(s) read into memory ..." << endl; else cout <<"(The file will be created when some student records exist.)" <<endl; bool changes = false; // set file 'update flag' to initial value ... for( ;; ) // loop forever ... until break ... { int reply = getReply( MENU ); if( reply == '1' || reply == 'V' ) // View ... viewStuds( fall ); else if( reply == '2' || reply == 'A' ) // Add ... from keyboard { int numStuds = newStud( fall ); cout << endl << numStuds << " student record(s) added ..." << " The total number of student records now is " << fall.size() << endl; if( numStuds ) // if >0 added ... update bool variable changes changes = true; } else if( reply == '3' || reply == 'S' ) // Sort ... but DON'T update // 'changes' unless 'data filed' { reply = getReply( "\nSort by id or name (i/n) ? " ); if( reply == 'I' ) { // using case sensitive id's to sort ... sort( fall.begin(), fall.end(), compare_id) ; cout << "Now sorted in memory by id. "; } else if( reply == 'N' ) { // using case insensitive names ... sort(fall.begin(), fall.end(), compare_nocaseName); cout << "Now sorted in memory by name. "; } else { cout << "Ok ... no new sort done here ...\n"; continue; } reply = getReply( "Update file (y/n) ? " ); if( reply == 'Y' ) { fileStuds( fall ); changes = false; cout << "File updated ...\n"; } else cout << "File NOT updated ...\n"; } else if( reply == '4' || reply == 'E' ) { if( editStud( fall ) ) changes = true; } else if( reply == '5' || reply == 'L' ) // Load/Read file into memory ... { int condition = readStuds( fall ); if( condition >= 0 ) { cout << "\nThere were " << condition << " student records read into memory from file." << endl; changes = false; } } else if( reply == '6' || reply == 'U' ) // Update file from memory ... { if( !changes ) cout << "\nNo changes to file ..." << endl; else { reply = getReply( "Are you sure you want to update" " the file (y/n) ? " ); if( reply == 'Y' ) { if( fileStuds( fall ) != (int)fall.size() ) cout << "\nUNEXPECTED ERROR! NOT all records were filed!" << "\nTry again ... If Error persits call IT." << endl; else { changes = false;// update file flag ... cout << "File write operation confirmed." << endl; } } } } else if( reply == '7' || reply == 'X' ) // eXit main show MENU/loop ... { // and ... if( changes ) // then ... { reply = getReply( "Are you sure you want to update" " the file (y/n) ? " ); if( reply == 'Y' ) { static int trys = 0; if( fileStuds( fall ) != (int)fall.size() ) { cout << "\nUNEXPECTED ERROR! NOT all records were filed!" << "\nTry again ... If Error persits call IT." << endl; ++trys; if( trys < 2 ) continue; } else { changes = false;// update file flag ... cout << "File write operation confirmed." << endl; } } } break; // and do exit program routine ... } else { cout << "\nChoice NOT implemented yet ...\n"; } // end of if( reply == ? ) 'switch' structure ... } // end of main 'forever loop' ... // debug exit routine ... ifstream ftest( THIS_TERM ); // recall 'THIS_TERM' is a Global variable if( !ftest ) { cout << "\nError attempting to open file " << THIS_TERM << " ...\n"; pauseForEnter(); } else // if reach here ... { ftest.close(); // first close file found ok above ... // then ... proceed ... to open the file in a system text editor ... // if you have a Win OS ... show structure of file if( 'Y' == getReply( "Show in notepad {y/n) ? " ) ) { string tmpSee = "notepad "; tmpSee += THIS_TERM; system( tmpSee.c_str() ); } }} ///////////////////////////////// END MAIN ///////////////////////////////////int getReply( const string& msg ){ cout << msg << flush; int reply = toupper( cin.get() ); cin.sync(); return reply;}void pauseForEnter(){ getReply( "\nPress 'Enter' to continue ... " );}// returns a valid iterator if ID is used already ... otherwise returns 'end()'vector< Student >::iterator existID( vector< Student >& term, const string& ID ){ vector < Student > :: iterator it; for( it = term.begin(); it != term.end(); ++it ) if( it->get_id() == ID ) return it; // else ... return it; // returns term.end() ...}// adds Student records to end of vector of Student records ... 'term'// gets input from keyboard ...int newStud( vector< Student >& term ){ cout << "\nEnter an empty record to exit this 'Input Loop' ..." << endl; int count = 0; string nam, num; for( ;; ) // loop forever until break ... { cout << "\nID : "; getline( cin, num ); if( existID( term, num ) != term.end() ) { cout << "\nThat 'id' " << num << " already exits ... " << endl; continue; // from the top of the forever loop right now } cout << "Name : "; getline( cin, nam ); if( nam == "" || num == "") break; int reply = getReply( "Add or Redo (a/r) ? " ); if( reply != 'A' ) { cout << "Aborted ..." << endl; continue; } // ok ... create and add this record to the end of the vector ... term.push_back( Student( nam, num )); ++count; cout << "Added " << count << " ..." << endl; } return count; // i.e. the count of added new students ...}// shows (to console screen) all student records in vector container ... 'term'void viewStuds( const vector< Student >& term ){ vector < Student > :: const_iterator it; int i = 0; cout << endl; // leading blank line ... for( it = term.begin(); it != term.end(); ++it ) { ostringstream oss; oss << "vector(" << setw(3) << setfill('0') << ++i << "): " << *it; cout << left << setw(39) /*<< setfill(' ')*/ << oss.str(); if( i % 2 == 0 ) cout << endl; // print 2 per line ... } if( i % 2 == 1 ) cout << endl; // if only a half line ... go to a new line}// file all records in memory ... create/overwrite file with name 'THIS_TERM'int fileStuds( const vector< Student >& term ){ ofstream fout( THIS_TERM ); // recall 'THIS_TERM' is a Global variable if( !fout ) { cout << "\nError attempting to open file " << THIS_TERM << endl; return -1; // report error condition ... } // else ... vector < Student > :: const_iterator it; int i = 0; for( it = term.begin(); it != term.end(); ++it, ++i ) fout << it->get_name() << "," << it->get_id() << endl; fout.close(); if( i == (int)term.size() ) cout << "\nAll " << i << " records filed ok." << endl; else cout << "\nOnly " << i << " of " << term.size() << " records were written ..." << endl; return i; // report success ... i.e. report count of records filed}// reads in all Student records from file 'THIS_TERM' ... if it exists// returns -1 if no file exists; else returns the number of records readint readStuds( vector< Student >& term ){ ifstream fin( THIS_TERM ); // recall THIS_TERM is a Global variable if ( !fin ) { cout << "Error attempting to open file " << THIS_TERM << " ... Perhaps it dosen't exist yet?" << endl; return -1; // report error condition ... } // else ... check existing term.size() first before re-setting? if( term.size() ) // i.e. if not == 0 ... { cout << "\nDo you want over-write the " << term.size(); int reply = getReply( " records in memory (y/n) ? " ); if( reply != 'Y' ) { cout << "Aborted ... " << flush; return 0; } // if reach here ... cout << "Ok ... will over-write the " << term.size() << " records in memory ... " << flush; } // if reach here ... term.clear(); // set to empty vector string nam, num; int i; for( i = 0; getline( fin, nam, ',' ); ++i ) // get 1st string (up to ',') { getline( fin, num, '\n' ); // then get rest of line (up to '\n') term.push_back( Student(nam, num) ); // construct and add new Student } fin.close(); return i; // report success? ... i.e. return the record count ...}// returns 'true' if a record was edited or erased; otherwise returns falsebool editStud( vector< Student > &term ){ cout << "\nNote: just enter an empty record to exit this 'Edit/Erase Function'" << "\nOk ... now enter the ID of the student record to edit : " << flush; string idStr, nam; getline( cin, idStr ); vector< Student >::iterator i, index; i = existID( term, idStr ); if( i == term.end() ) { cout << "This '" << idStr << "' does not exist." << endl; return false; } // else ... show ... and ask if ok to edit ... cout << "Name : " << i->get_name() << endl << "ID : " << i->get_id() << endl; int reply = getReply( "Abort or Edit/Erase (a/e) ? " ); if( reply != 'E' ) { cout << "Aborted ... " << endl; return false; } reply = getReply( "\nDo you want to erase this record (y/n) ? " ); if( reply == 'Y' ) { term.erase( i ); cout << "Erased ...\n"; return true; } // else ... ok ... so will edit id ... then name cout << "\nOk ... will edit ... Recall ...\n" << "Just enter an 'empty string' to abort/exit this edit ... " << "\nEnter NEW ID : "; getline( cin, idStr ); index = existID( term, idStr ); if( index != term.end() && index != i ) // exclude 'i' so can edit 'i' { cout << "\nThe ID '" << idStr << "' already exits ... " << endl; return false; // exit to menu now ... } // ok ... get new name ... cout << "Enter NEW Name : "; getline( cin, nam ); if( nam == "" || idStr == "" ) { cout << "Aborted ..." << endl; return false; } reply = getReply( "Ok or Redo (o/r) ? " ); if( reply != 'O' ) // cap 'O' ... as in Ok { cout << "Aborted ..." << endl; return false; } // ok ... so ... go ahead and edit i->set_name( nam ); i->set_id( idStr ); cout << "Edited ..." << endl; return true;}
Bob Jones,1Suzy McQueen,2Tim Horton,3Bob Jones,4Suzy McQueen,5Jane Thomas,10Jane Thomas,6
/* Student_Cvec.c // this version 2011-07-29 // *//* A simple example of processing Student records ... using my Cvec ... an emulation of the C++ STL vector container ... to hold each 'Student' object/record/Cvec_member See MENU below to see what this program does ... Note: * this program allows only unique student id's for each record * this program is set to update its file, (if there were any changes), before quitting*/#include "readWord.h" /* includes stdio.h, stdlib.h, string.h, etc... */#include <ctype.h> /* re. tolower/toupper for case insensitive comparison *//* Globals ... */#define THIS_TERM "fall.txt" /* file name for this term's records */#define MENU "\n" \ " 1. V iew all records in memory at present\n" \ " 2. A dd a new student name and id\n" \ " 3. S ort student records\n" \ " 4. E dit/E rase a student record\n" \ " 5. L oad in student records from file\n" \ " 6. U pdate file with records currently in memory\n" \ " 7. e X it program\n\n" \ "Your choice (1..7) : "typedef struct myStudent{ char* name; char* id;} Student ;#define Rec Studentvoid freeVrec( Rec* p ){ free( p->id ); free( p->name );}/* Ok ... now can ... */#include "Cvec.h"/* ... and then can ... */#include "Cvec_func's.h"/* Note: this name comparison is NOT case sensitive ... */int compare_nocaseName( const Rec* x, const Rec* y ){ char *a = x->name, *b = y->name; int test; while( *a && *b && tolower(*a) == tolower(*b) ) ++a, ++b ; /* ok ... now check end conditions ... */ test = tolower(*a) - tolower(*b) ; if( test ) return test; /* else ... names equal since test == 0 above ... so ... */ return strcmp(x->id, y->id);}int compare_id( const Rec* a, const Rec* b ){ return strcmp(a->id, b->id );}/* functions used by main to process a vec of Student records */int getReply( const char msg[] );void pauseForEnter();int existID( Cvec* term, const char* ID );int newStud( Cvec* term );void viewStuds( const Cvec* term );int fileStuds( const Cvec* term );int readStuds( Cvec* term );int editStud( Cvec* term );int main() /* //////////////////////// BEGIN MAIN /////////////////////////// */{ FILE* ftest; int count, changes = 0; /* set file 'changes' flag to initial value */ /* create a 'fall vec' to hold student names and ids for the 'Fall Term' also holds number of records, via 'fall.size' */ Cvec fall; initCvec( &fall ); /* now get all records from file ... if it exists ? */ count = readStuds( &fall ); if( count >= 0 ) printf( "%d student record(s) read into memory ...\n", count ); else puts( "(The file will be created when some student records exist.)" ); for( ;; ) /* loop forever ... until break ... */ { int reply = getReply( MENU ); if( reply == '1' || reply == 'V' ) /* View ... */ viewStuds( &fall ); else if( reply == '2' || reply == 'A' ) /* Add ... from keyboard */ { int numNewStuds = newStud( &fall ); printf( "\n%d student record(s) added ... " "The total number of student records now is %d\n", numNewStuds, fall.size ); if( numNewStuds ) /* if >0 added ... update bool variable changes */ changes = 1; } else if( reply == '3' || reply == 'S' ) /* Sort ... but DON'T update 'changes' unless 'data filed' */ { reply = getReply( "\nSort by id or name (i/n) ? " ); if( reply == 'I' ) { msortCvec( &fall, compare_id ); /* case sensitive id's in sort */ fputs( "Now sorted in memory by id. ", stdout ); } else if( reply == 'N' ) { msortCvec( &fall, compare_nocaseName ); /* case insensitive */ fputs( "Now sorted in memory by name. ", stdout ); } else { puts( "Ok ... no new sort done here ..." ); continue; } reply = getReply( "Update file (y/n) ? " ); if( reply == 'Y' ) { fileStuds( &fall ); changes = 0; /* reset so will match present file ... */ puts( "File updated ..." ); } else puts( "File NOT updated ..." ); } else if( reply == '4' || reply == 'E' ) { if( editStud( &fall ) ) changes = 1; } else if( reply == '5' || reply == 'L' ) /* Load/Read file into memory */ { int condition = readStuds( &fall ); if( condition >= 0 ) { printf( "\nThere were %d student records read into memory " "from file.\n", condition ); changes = 0; /* reset so will match present file ... */ } } else if( reply == '6' || reply == 'U' ) /* Update file from memory */ { if( !changes ) puts( "\nNo changes to file ..." ); else { reply = getReply( "Are you sure you want to update" " the file (y/n) ? " ); if( reply == 'Y' ) { if( fileStuds(&fall) != fall.size ) puts( "\nUNEXPECTED ERROR! NOT all records were filed!" "\nTry again ... If Error persits call IT." ); else { changes = 0; /* update file flag */ puts( "File write operation confirmed." ); } } } } else if( reply == '7' || reply == 'X' ) /* eXit main show MENU/loop */ { /* and ... */ if( changes ) /* then ... */ { reply = getReply( "Are you sure you want to update" " the file (y/n) ? " ); if( reply == 'Y' ) { static int trys = 0; if( fileStuds( &fall ) != fall.size ) { puts( "\nUNEXPECTED ERROR! NOT all records were filed!" "\nTry again ... If Error persits call IT." ); ++trys; if( trys < 2 ) continue; } else { changes = 0; /* update file flag */ puts( "File write operation confirmed." ); } } } break; /* and do exit program routine ... */ } else { puts( "\nChoice NOT implemented yet ..." ); } /* end of if( reply == ? ) 'switch' structure ... */ } /* end of main 'forever loop' ... */ /* debug exit routine ... */ ftest = fopen(THIS_TERM, "r"); /* recall 'THIS_TERM' is a Global variable */ if( !ftest ) { printf( "\nError attempting to open file %s ...", THIS_TERM ); pauseForEnter(); } else /* if reach here ... */ { fclose( ftest ); // first close file found ok above ... /* then ... proceed ... to open the file in a system text editor ... if you have a Win OS ... show structure of file */ if( 'Y' == getReply("Show in notepad (y/n) ? ") ) system( "notepad " THIS_TERM ); /* compiler concat's strings */ } return 0;} /* /////////////////////////////// END MAIN /////////////////////////////// */int getReply( const char msg[] ){ int c, reply; fputs( msg, stdout ); fflush( stdout ); c = reply = toupper( getchar() ); while( c != '\n' ) c = getchar(); /* flush stdin ... */ return reply;}void pauseForEnter(){ getReply( "\nPress 'Enter' to continue ... " );}/* returns a valid iterator if ID is used already ... otherwise returns 'end()' */int existID( Cvec* term, const char* ID ){ int i; for( i = 0; i < term->size; ++i ) if( strcmp(term->ary[i].id, ID) == 0 ) return i; /* else ... */ return -1;}/* adds Student records to end of vec of Student records ... 'term' gets input from keyboard ... */int newStud( Cvec* term ){ int count = 0; Rec rec; puts( "\nNote: Enter quit to exit this 'Input Loop' ..." ); for( ;; ) /* loop forever until break ... */ { char c; fputs( "\nID : ", stdout ); fflush( stdout ); rec.id = readWord( stdin, 8, "\n", &c ); if( strcmp(rec.id, "quit") == 0 ) { free(rec.id); return 0; } if( existID( term, rec.id ) != -1 ) { printf( "\nThat 'id' %s already exits ...\n", rec.id ); free( rec.id ); continue; /* from the top of the forever loop right now */ } fputs( "Name : ", stdout ); fflush( stdout ); rec.name = readWord( stdin, 32, "\n", &c ); if( getReply( "Add or Redo (a/r) ? " ) != 'A' ) { puts( "Aborted ..." ); freeVrec( &rec ); continue; } /* ok ... create and add this record to the end of the vec ... */ push_backCvec( term, &rec ); ++count; printf( "Added %d ...\n", count ); } return count; /* i.e. the count of added new students ... */}// shows (to console screen) all student records in vec container ... 'term'void viewStuds( const Cvec* term ){ Rec* it; int i; char buf[256]; putchar( '\n' ); /* leading blank line ... */ for( i = 0 ; i < term->size ; ) { it = &term->ary[i]; sprintf( buf, "(%03d): %s, %s", ++i, it->name, it->id ); printf( "%-30s", buf ); if( i % 2 == 0 ) putchar( '\n' ); /* print 2 per line ... */ } if( i % 2 == 1 ) putchar( '\n' ); /* if only a half line, go to a new line */ fflush( stdout );}/* file all records in memory ... create/overwrite file with name 'THIS_TERM' */int fileStuds( const Cvec* term ){ FILE* fout = fopen( THIS_TERM, "w" ); /* recall 'THIS_TERM' is a Global variable */ if( !fout ) { printf( "\nError attempting to open file %s\n", THIS_TERM ); return -1; /* report error condition ... */ } else { Rec* it; int i; for( i = 0; it != NULL; ++i ) { it = &term->ary[i]; fprintf( fout, "%s, %s\n", it->name, it->id ); } fclose( fout ); if( i == term->size ) printf( "\nAll %d records filed ok.\n", i ); else printf( "\nOnly %d of %d records were written ...\n", i, term->size ); return i; /* report success ... i.e. report count of records filed */ }}/* reads in all Student records from file 'THIS_TERM' ... if it exists returns -1 if no file exists; else returns the number of records read */int readStuds( Cvec* term ){ int i; char c; Rec rec; FILE* fin = fopen( THIS_TERM, "r" ); /* recall THIS_TERM is a Global variable */ if( !fin ) { printf( "Error attempting to open file %s" " ... Perhaps it dosen't exist yet?\n\n", THIS_TERM ); return -1; /* report error condition ... */ } /* else ... check existing term size first before re-setting? */ if( term->size ) /* i.e. if not == 0 ... */ { printf( "\nDo you want over-write the %d", term->size ); if( getReply(" records in memory (y/n) ? ") != 'Y' ) { fputs( "Aborted ... ", stdout ); fflush( stdout );; return 0; } /* if reach here ... */ printf( "Ok ... will over-write the %d records in memory ... ", term->size ); fflush( stdout ); } /* if reach here ... */ clearCvec( term ); /* set to empty vec */ for( i = 0; (rec.name = readWord( fin, 32, ",", &c )); ++i ) /* get 1st string (up to ',') */ { rec.id = readWord(fin, 8, "\n", &c); /* then get rest of line (up to '\n') */ push_backCvec( term, &rec ); } fclose( fin ); return i; // report success? ... i.e. return the record count ...}/* returns 1 if a record was edited or erased ... otherwise returns 0 */int editStud( Cvec* term ){ int i, index; char *idStr, *nam;; char c; fputs( "\nNote: just enter quit to exit this 'Edit/Erase Function'" "\nOk ... now enter the ID of the student record to edit/erase : ", stdout ); fflush( stdout ); idStr = readWord( stdin, 8, "\n", &c ); if( strcmp(idStr, "quit") == 0 ) { free(idStr); return 0; } i = existID( term, idStr ); if( i == -1 ) { printf( "This '%s' does not exist.\n", idStr ); free( idStr ); return 0; } /* else ... show ... and ask if ok to edit ... */ printf( "Name : %s\n" "ID : %s\n", term->ary[i].name, term->ary[i].id ); if( getReply("Abort or Edit/Erase (a/e) ? ") != 'E' ) { puts( "Aborted ... " ); free( idStr ); return 0; } if( getReply("\nDo you want to erase this record (y/n) ? ") == 'Y' ) { eraseCvec( term, i ); puts( "Erased ..." ); free( idStr ); return 1; } /* else ... ok ... so will edit id ... then name */ fputs( "\nOk ... will edit ... Recall ... " "just enter quit to abort/exit this edit." "\nEnter NEW ID : ", stdout ); fflush( stdout ); free( idStr ); /* now get new id string ... */ idStr = readWord( stdin, 8, "\n", &c ); if( strcmp(idStr, "quit") == 0 ) { free(idStr); return 0; } index = existID( term, idStr ); if( index > -1 && index != i ) /* exclude 'i' so can edit 'i' */ { printf( "\nThe ID '%s' already exits ...\n", idStr ); free( idStr ); return 0; /* exit to menu now ... */ } /* ok ... get new name ... */ fputs( "Enter NEW Name : ", stdout ); fflush( stdout ); nam = readWord( stdin, 32, "\n", &c ); if( nam[0] == 0 || idStr[0] == 0 ) { puts( "Aborted ..." ); free( nam ); free( idStr ); return 0; } if( getReply("Ok or Redo (o/r) ? ") != 'O' ) /* cap 'O' ... as in Ok */ { puts( "Aborted ..." ); free( nam ); free( idStr ); return 0; } /* ok ... so ... go ahead and edit, but first ... */ freeVrec( &term->ary[i] ); term->ary[i].name = nam; term->ary[i].id = idStr; puts( "Edited ..." ); return 1;}