Code:
/* hardwareware.dat */
#include <stdio.h>
/* hardwareData structure definition */
struct hardwareData {
int recordNum;
char toolname[20];
int quantity;
double cost;
}; /* end structure hardwareData */
/* prototypes */
int enterChoice( void );
void textFile( FILE *readPtr );
void updateRecord( FILE *fPtr );
void newRecord( FILE *fPtr );
void deleteRecord( FILE *fPtr );
FILE *hfPtr; /* hardware.dat file pointer */
int main()
{
FILE *hfPtr; /* hardware.dat file pointer */
int choice; /* user choice */
/* fopen opens file; exits if file cannot be opened */
if ((hfPtr = fopen( "hardware.dat", "rb+" )) == NULL ) {
printf( "File could not be opened.\n" );
} /* end if */
else {
/* enable user to specify action */
while (( choice = enterChoice()) != 5 ) {
switch ( choice ) {
/* create text file from record */
case 1:
textFile( hfPtr );
break;
/* update record */
case 2:
updateRecord( hfPtr );
break;
/* create record */
case 3:
newRecord ( hfPtr );
break;
/* delete existing record */
case 4:
deleteRecord ( hfPtr );
break;
/* display message if user does not enter valid choice */
default:
printf( "Incorrect choice\n" );
break;
} /* end switch */
} /* end while */
fclose( hfPtr ); /* fclose closes the file */
} /* end else */
return 0; /* indicate successful termination */
} /* end main */
/* create formated text for printing */
void textFile( FILE *readPtr )
{
FILE *writePtr; /* hardware.txt file pointer */
/* create hardwareData with default information */
struct hardwareData hardware = { 0, "", 0,0.0 };
/* fopen opens file; exits if file cannot be opened */
if ((hfPtr = fopen( "hardware.txt", "rb+" )) == NULL ) {
printf( "File could not be opened.\n" );
} /* end if */
else{
rewind( readPtr ); /* sets pointer to begining of file */
fprintf( writePtr, "%-6s%-10s%-8s%-8s\n",
"Record#", "Tool name", "Quantity", "Cost" );
/* copy all records from random-access file to text file */
while ( !feof( readPtr ) ) {
fread( &hardware, sizeof( struct hardwareData ),1, readPtr );
/* write single record to text file */
if ( hardware.recordNum != 0 ) {
fprintf( "%-6d%-16s%-11d%10.2f\n",
hardware.toolname, hardware.quantity, hardware.cost );
} /* end if */
} /* end while */
fclose( writePtr ); /* fclose closes file */
} /* end else */
} /* end function textrFile */
/* update record */
void updateRecord ( FILE *fPtr )
{
int record; /* record number */
/* create record data with no information */
struct hardwareData hardware = { 0, "", 0,0.0 };
/* obtain number of account to update */
printf( "Enter record to update (0-100): ");
scanf( "%d", &record );
/* move file pointer to correct record */
fseek( fPtr, ( record - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* read record from file */
fread( &record, sizeof( struct hardwareData ), 1, fPtr );
/* display error if record does not exist */
if ( hardware.recordNum == 0) {
printf( "Record #%d has no information.\n", record );
} /* end if */
else { /* update record */
printf( "Enter new tool name, quantity,cost \n?" );
scanf( "%s%d%f", hardware.toolname, hardware.quantity, hardware.cost );
fseek( fPtr, ( record - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* write updated record over old record */
fwrite( &hardware, sizeof( struct hardwareData ), 1, fPtr );
} /* end else */
} /* end function update record */
/* delete an existing record */
void deleteRecord( FILE *fPtr )
{
struct hardwareData hardware; /* stores record read form file */
struct hardwareData blankRecord = { 0, "", 0,0.0 }; /* blank record */
int recordNum;
/* obtain number of record to delete */
printf( "Enter record number to delete (0-100): " );
scanf( "%d", &recordNum );
/* move file pointer to correct file */
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* read record from file */
fread( &hardware, sizeof( struct hardwareData ), 1, fPtr );
/* display error if record does not exist */
if ( hardware.recordNum==0 ) {
printf ( "Record %d does not exist.\n", recordNum );
} /* end if */
else { /* delete record */
/* move file pointer to correct record */
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* replace existing record with blank record */
fwrite( &blankRecord,
sizeof( struct hardwareData ), 1, fPtr );
} /* end else */
} /* end function delete record */
/* create and insert record */
void newRecord( FILE *fPtr )
{
/* create recordData with default information */
struct hardwareData hardware = { 0, "", 0,0.0 };
int recordNum;
/* obtain record number to create */
printf( "Enter record number to create (1-100) : " );
scanf( "%d", &recordNum );
/* move file pointer to correct record */
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* read record */
fread( &hardware, sizeof( struct hardwareData ), 1, fPtr );
/* display error if record already exists */
if ( hardware.recordNum != 0 ) {
printf( "Record already exists" );
} /* end if */
else { /* create record */
/* user enters toolname, quantity and cost */
printf( "Enter tool name, quantity, cost\n" );
scanf( "%s%d%f", &hardware.toolname, &hardware.quantity, &hardware.cost );
/* move file pointer to correct record */
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ),
SEEK_SET );
/* insert record into file */
fwrite( &hardware,
sizeof( struct hardwareData ), 1, fPtr );
} /* end else */
} /* end function newRecord */
/* enable user to input menu choice */
int enterChoice( void )
{
int menuChoice; /* variable to stoer users choice */
/* display available options */
printf( "\nEnter your choice\n"
"1 - store a formatted text file of records called\n"
" \"hardware.txt\"for printing\n"
"2 - update a record\n"
"3 - add a new record\n"
"4 - delete a record\n"
"5 - end program\n? " );
scanf( "%d", & menuChoice ); /* recieve choice from user */
return menuChoice;
} /* end function enterChoice */