File handling example of a goods re-ordering program
The following program handles an ASCII text file which describes
a number of products, and reads each product into a structure
with the program.
/* File handling example for PR101 */ /* processing an ASCII file of records */ /* Written by B. Brown, April 1994 */ /* */ /* process a goods file, and print out */ /* all goods where the quantity on */ /* hand is less than or equal to the */ /* re-order level. */ #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> /* definition of a record of type goods */ struct goods { char name[20]; /* name of product */ float price; /* price of product */ int quantity; /* quantity on hand */ int reorder; /* re-order level */ }; /* function prototypes */ void myexit( int ); void processfile( void ); void printrecord( struct goods ); int getrecord( struct goods * ); /* global data variables */ FILE *fopen(), *input_file; /* input file pointer */ /* provides a tidy means to exit program gracefully */ void myexit( int exitcode ) { if( input_file != NULL ) fclose( input_file ); exit( exitcode ); } /* prints a record */ void printrecord( struct goods record ) { printf("\nProduct name\t%s\n", record.name ); printf("Product price\t%.2f\n", record.price ); printf("Product quantity\t%d\n", record.quantity ); printf("Product reorder level\t%d\n", record.reorder ); } /* reads one record from inputfile into 'record', returns 1 for success */ int getrecord( struct goods *record ) { int loop = 0, ch; char buffer[40]; ch = fgetc( input_file ); /* skip to start of record */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* read product name */ while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; strcpy( record->name, buffer ); if( ch == EOF ) return 0; /* skip to start of next field */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* read product price */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->price = atof( buffer ); if( ch == EOF ) return 0; /* skip to start of next field */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* read product quantity */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->quantity = atoi( buffer ); if( ch == EOF ) return 0; /* skip to start of next field */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* read product reorder level */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->reorder = atoi( buffer ); if( ch == EOF ) return 0; return 1; /* signify record has been read successfully */ } /* processes file for records */ void processfile( void ) { struct goods record; /* holds a record read from inputfile */ while( ! feof( input_file )) { if( getrecord( &record ) == 1 ) { if( record.quantity <= record.reorder ) printrecord( record ); } else myexit( 1 ); /* error getting record */ } } main() { char filename[40]; /* name of database file */ printf("Example Goods Re-Order File Program\n"); printf("Enter database file "); scanf(" %s", filename ); input_file = fopen( filename, "rt" ); if( input_file == NULL ) { printf("Unable to open datafile %s\n", filename ); myexit( 1 ); } processfile(); myexit( 0 ); }
The datafile (a standard ASCII text file) used for this example looks like
baked beans 1.20 10 5 greggs coffee 2.76 5 10 walls ice-cream 3.47 5 5 cadburys chocs 4.58 12 10