home *** CD-ROM | disk | FTP | other *** search
/ Sams Teach Yourself C in 21 Days (6th Edition) / STYC216E.ISO / mac / Examples / WeekRev03 / week3.c < prev    next >
C/C++ Source or Header  |  2002-05-22  |  6KB  |  235 lines

  1. /* Program Name:  week3.c                            */
  2. /* Program to keep track of names and phone numbers. */
  3.  
  4. /* Information is written to a disk file specified   */
  5. /* with a command-line parameter.                    */
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <time.h>
  10. #include <string.h>
  11.  
  12. /*** defined constants ***/
  13. #define YES   1
  14. #define NO    0
  15. #define REC_LENGTH  54
  16.  
  17. /*** variables ***/
  18.  
  19. struct record {
  20.    char fname[15+1];              /* first name + NULL   */
  21.    char lname[20+1];              /* last name + NULL    */
  22.    char mname[10+1];              /* middle name + NULL  */
  23.    char phone[9+1];               /* phone number + NULL */
  24. } rec;
  25.  
  26. /*** function prototypes ***/
  27.  
  28. int  main(int argc, char *argv[]);
  29. void display_usage(char *filename);
  30. int  display_menu(void);
  31. void get_data(FILE *fp, char *progname, char *filename);
  32. void display_report(FILE *fp);
  33. int  continue_function(void);
  34. int  look_up( FILE *fp );
  35.  
  36. /* start of program */
  37.  
  38. int main(int argc, char *argv[])
  39. {
  40.     FILE *fp;
  41.     int  cont = YES;
  42.  
  43.     if( argc < 2 )
  44.     {
  45.        display_usage("WEEK3");
  46.        exit(1);
  47.     }
  48.  
  49.     /* Open file. */
  50.     if ((fp = fopen( argv[1], "a+")) == NULL)
  51.     {
  52.         fprintf( stderr, "%s(%d)--Error opening file %s",
  53.                              argv[0],__LINE__, argv[1]);
  54.         exit(1);
  55.     }
  56.  
  57.     while( cont == YES )
  58.     {
  59.        switch( display_menu() )
  60.        {
  61.          case '1': get_data(fp, argv[0], argv[1]); /* Day 18*/
  62.                    break;
  63.          case '2': display_report(fp);
  64.                    break;
  65.          case '3': look_up(fp);
  66.                    break;
  67.          case '4': printf("\n\nThank you for using this program!\n");
  68.                    cont = NO;
  69.                    break;
  70.          default:  printf("\n\nInvalid choice, Please select 1 to 4!");
  71.                    break;
  72.        }
  73.     }
  74.     fclose(fp);       /* close file */
  75.     return(0);
  76. }
  77.  
  78. /* display_menu() */
  79.  
  80. int display_menu(void)
  81. {
  82.     char ch, buf[20];
  83.  
  84.     printf( "\n");
  85.     printf( "\n     MENU");
  86.     printf( "\n   ========\n");
  87.     printf( "\n1.  Enter names");
  88.     printf( "\n2.  Print report");
  89.     printf( "\n3.  Look up number");
  90.     printf( "\n4.  Quit");
  91.     printf( "\n\nEnter Selection ==> ");
  92.     gets(buf);
  93.     ch = *buf;
  94.     return(ch);
  95. }
  96.  
  97. /****************************************************
  98. Function:  get_data()
  99. *****************************************************/
  100.  
  101. void get_data(FILE *fp, char *progname, char *filename)
  102. {
  103.    int cont = YES;
  104.  
  105.    while( cont == YES )
  106.    {
  107.       printf("\n\nPlease enter information: " );
  108.  
  109.       printf("\n\nEnter first name: ");
  110.       gets(rec.fname);
  111.       printf("\nEnter middle name: ");
  112.       gets(rec.mname);
  113.       printf("\nEnter last name: ");
  114.       gets(rec.lname);
  115.       printf("\nEnter phone in 123-4567 format: ");
  116.       gets(rec.phone);
  117.       if (fseek( fp, 0, SEEK_END ) == 0)
  118.          if( fwrite(&rec, 1, sizeof(rec), fp) != sizeof(rec))
  119.          {
  120.             fprintf( stderr, "%s(%d) Error writing to file %s",
  121.                           progname,__LINE__, filename);
  122.             exit(2);
  123.          }
  124.       cont = continue_function();
  125.    }
  126. }
  127.  
  128. /********************************************************
  129. Function:  display_report()
  130. Purpose:   To print out the formatted names and numbers
  131.            of people in the file.
  132. *********************************************************/
  133.  
  134. void display_report(FILE *fp)
  135. {
  136.     time_t rtime;
  137.     int num_of_recs = 0;
  138.  
  139.     time(&rtime);
  140.  
  141.     fprintf(stdout, "\n\nRun Time: %s", ctime( &rtime));
  142.     fprintf(stdout, "\nPhone number report\n");
  143.  
  144.     if(fseek( fp, 0, SEEK_SET ) == 0)
  145.     {
  146.        fread(&rec, 1, sizeof(rec), fp);
  147.        while(!feof(fp))
  148.        {
  149.           fprintf(stdout,"\n\t%s, %s %c %s", rec.lname,
  150.                                   rec.fname, rec.mname[0],
  151.                                   rec.phone);
  152.           num_of_recs++;
  153.           fread(&rec, 1, sizeof(rec), fp);
  154.        }
  155.        fprintf(stdout, "\n\nTotal number of records: %d",
  156.                num_of_recs);
  157.        fprintf(stdout, "\n\n* * * End of Report * * *");
  158.     }
  159.     else
  160.        fprintf( stderr, "\n\n*** ERROR WITH REPORT ***\n");
  161. }
  162.  
  163. /**************************************************
  164. *  Function:  continue_function()
  165. **************************************************/
  166.  
  167. int continue_function( void )
  168. {
  169.     char ch, buf[20];
  170.     do
  171.     {
  172.         printf("\n\nDo you wish to enter another? (Y)es/(N)o ");
  173.         gets(buf);
  174.         ch = *buf;
  175.     } while( strchr( "NnYy", ch) == NULL );
  176.  
  177.     if(ch == 'n' || ch == 'N')
  178.         return(NO);
  179.     else
  180.         return(YES);
  181. }
  182.  
  183. /**********************************************************
  184. *  Function:  display_usage()
  185. ***********************************************************/
  186.  
  187. void display_usage( char *filename )
  188. {
  189.     printf("\n\nUSAGE: %s filename", filename );
  190.     printf("\n\n   where filename is a file to store people\'s names");
  191.     printf("\n     and phone numbers.\n\n");
  192. }
  193.  
  194. /**********************************************
  195. *  Function:  look_up()
  196. *  Returns:   Number of names matched
  197. *************************************************/
  198.  
  199. int look_up( FILE *fp )
  200. {
  201.     char tmp_lname[20+1];
  202.     int  ctr = 0;
  203.  
  204.     fprintf(stdout, "\n\nPlease enter last name to be found: ");
  205.     gets(tmp_lname);
  206.  
  207.     if( strlen(tmp_lname) != 0 )
  208.     {
  209.        if (fseek( fp, 0, SEEK_SET ) == 0)
  210.        {
  211.           fread(&rec, 1, sizeof(rec), fp);
  212.           while( !feof(fp))
  213.           {
  214.              if( strcmp(rec.lname, tmp_lname) == 0 )
  215.              /* if matched */
  216.              {
  217.                 fprintf(stdout, "\n%s %s %s - %s", rec.fname,
  218.                                                rec.mname,
  219.                                                rec.lname,
  220.                                                rec.phone);
  221.                 ctr++;
  222.              }
  223.              fread(&rec, 1, sizeof(rec), fp);
  224.           }
  225.        }
  226.        fprintf( stdout, "\n\n%d names matched.", ctr );
  227.     }
  228.     else
  229.     {
  230.         fprintf( stdout, "\nNo name entered." );
  231.     }
  232.     return(ctr);
  233. }
  234.  
  235.