Code:
#include <stdio.h>#include <stdlib.h>
#include <math.h>
struct hardwareData
{
int recordNum;
char toolname[20];
int quantity;
int cost;
};
/* prototypes */
int enterChoice( void );
void textFile( FILE *readPtr );
void updateRecord( FILE *fPtr );
void newRecord( FILE *fPtr );
void deleteRecord( FILE *fPtr );
int main()
{
FILE *cfPtr;
cfPtr = fopen( "hardware.dat", "w" );
int choice;
if ((cfPtr = fopen( "hardware.dat", "rb+" )) == NULL )
{
printf( "File could not be opened.\n" );
}
else
{
while (( choice = enterChoice()) != 5 )
{
switch ( choice )
{
/* create text file from record */
case 1:
textFile( cfPtr );
break;
/* update record */
case 2:
updateRecord( cfPtr );
break;
/* create record */
case 3:
newRecord ( cfPtr );
break;
/* delete existing record */
case 4:
deleteRecord ( cfPtr );
break;
/* display message if user does not enter valid choice */
default:
printf( "Incorrect choice\n" );
break;
}
}
fclose( cfPtr );
}
return 0;
}
void textFile( FILE *readPtr )
{
FILE *writePtr;
struct hardwareData hardware = { 0, "", 0, 0 };
if ((writePtr = fopen( "hardware.txt", "w" )) == NULL )
{
printf( "File could not be opened.\n" );
}
else
{
rewind( readPtr );
/* 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(writePtr, "%d %s %d %d\n", hardware.recordNum, hardware.toolname, hardware.quantity, hardware.cost );
}
else
{
printf("File is empty.\n");
}
}
fclose( writePtr );
}
writePtr = fopen( "hardware.txt", "r" );
int toolNumber;
char toolName[20];
int toolQuanity;
int toolCost;
char buf[BUFSIZ] = "Garbage";
//while ( !feof( writePtr ) ) {
while ( fgets(buf, sizeof(buf), writePtr) != NULL)
{
//fgets(buf, sizeof(buf), fp) != NULL
fscanf( writePtr, "%d%[^0-9-]%d%d", &toolNumber, toolName, &toolQuanity, &toolCost );
printf( "%d %s %d %d\n", toolNumber, toolName, toolQuanity, toolCost );
}
fclose( writePtr );
}
void updateRecord ( FILE *fPtr )
{
int record;
struct hardwareData hardware = { 0, "", 0, 0 };
printf( "Enter record to update (1-100): ");
scanf( "%d", &record );
fseek( fPtr, ( record - 1 ) * sizeof( struct hardwareData ), SEEK_SET );
fread( &record, sizeof( struct hardwareData ), 1, fPtr );
if ( hardware.recordNum == 0)
{
printf( "Record #%d has no information.\n", record );
}
else
{ /* update record */
printf( "Enter new tool name, quantity,cost \n?" );
scanf( "%s%d%d", 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 );
}
}
void deleteRecord( FILE *fPtr )
{
struct hardwareData hardware;
struct hardwareData blankRecord = { 0, "", 0,0 };
int recordNum;
printf( "Enter record number to delete (1-100): " );
scanf( "%d", &recordNum );
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ), SEEK_SET );
fread( &hardware, sizeof( struct hardwareData ), 1, fPtr );
if ( hardware.recordNum==0 )
{
printf ( "Record %d does not exist.\n", recordNum );
}
else
{
fseek( fPtr, ( recordNum - 1 ) * sizeof( struct hardwareData ), SEEK_SET );
fwrite( &blankRecord, sizeof( struct hardwareData ), 1, fPtr );
}
}
void newRecord( FILE *fPtr )
{
struct hardwareData hardware = { 0, "", 0, 0 };
int piece;
printf( "Enter record number to create (1-100) : " );
scanf( "%d", &piece);
fseek( fPtr, (piece - 1) * sizeof( struct hardwareData ), SEEK_SET );
fread( &hardware, sizeof( struct hardwareData ), 1, fPtr );
if ( hardware.recordNum != 0 )
{
printf( "Record already exists.\n", hardware.recordNum );
}
else
{
printf( "Enter tool name, quantity, cost\n?" );
scanf("%s%d%d", hardware.toolname, &hardware.quantity, &hardware.cost);
hardware.recordNum = piece;
fseek(fPtr, (hardware.recordNum-1) * sizeof( struct hardwareData), SEEK_SET);
fwrite( &hardware, sizeof( struct hardwareData), 1, fPtr);
}
}
int enterChoice( void )
{
int menuChoice;
printf( "\nEnter your choice\n"
"1 - List of all tools\n"
"2 - Update an existing tool\n"
"3 - Add a new tool\n"
"4 - Delete a tool\n"
"5 - End program\n? " );
scanf( "%d", &menuChoice );
return menuChoice;
}