Everything is working fine in my program with no compliling errors. However, when I go to list the data, it writes it twice. I can't figure out what is wrong in my code.
#include <stdio.h>
#include <string.h>
struct inventory
{
int number;
char toolName[15];
int quantity;
double price;
};
int enterChoice(void);
void List( FILE *readPtr);
void updateRecord( FILE *fPtr);
void newRecord (FILE *fPtr);
void deleteRecord (FILE *fPtr);
int main (void)
{
FILE *CtPtr;
int choice;
if ( ( CtPtr = fopen( "hardware.dat", "rb+" ) ) == NULL ) {
if ( ( CtPtr = fopen( "hardware.dat", "wb" ) ) == NULL );
}
while (( choice = enterChoice())!= 4){
switch (choice){
case 1:
newRecord(CtPtr);
break;
case 2 :
deleteRecord(CtPtr);
break;
case 3:
List(CtPtr);
break;
default:
printf("Incorrect choice\n");
break;
}
}
fclose (CtPtr);
return 0;
}
int enterChoice (void)
{
int menuChoice;
printf("1 - Input new tool or update an existing tool\n"
"2 - Delete a tool\n"
"3 - List all tools\n"
"4 - Exit\n");
scanf ("%d", &menuChoice);
return menuChoice;
}
void newRecord (FILE*fPtr)
{
struct inventory data={0,"",0,0.0};
int toolNumber;
printf ("Enter record number (1-100):");
scanf ("%d", &toolNumber);
fseek( fPtr, (toolNumber-1)*sizeof(struct inventory),SEEK_SET);
fread(&data, sizeof(struct inventory),1,fPtr);
if (data.number !=0){
printf( "%-12d%-13s%-10d%-10.2f\n\n", data.number, data.toolName, data.quantity, data.price );
int index = 0;
printf( "Enter new tool name: ");
fgets( data.toolName, 20, stdin );
index = strlen( data.toolName)-1;
if( data.toolName[ index ] == '\n' )
data.toolName[index]='\0';
fscanf(stdin, "%s", data.toolName);
printf( "Enter new quantity: ");
fscanf( stdin, "%d", &data.quantity );
printf( "Enter new price: ");
fscanf( stdin, "%lf", &data.price );
printf( "%-12s%-13s%-10s%-10s\n%-12d%-13s%-10d%-10.2f\n\n", "Record #", "Tool Name", "Quantity", "Cost", data.number, data.toolName, data.quantity, data.price );
int record;
fseek( fPtr, ( record - 1 ) * sizeof( struct inventory ), SEEK_SET );
fwrite( &data, sizeof( struct inventory ), 1, fPtr );
}
else{
printf("Enter Tool Name, quantity, and price\n?");
scanf("%s%d%lf", data.toolName, &data.quantity, &data.price);
data.number = toolNumber;
fseek(fPtr, (data.number - 1)*sizeof(struct inventory), SEEK_SET);
fwrite(&data, sizeof(struct inventory), 1,fPtr);
}
}
void deleteRecord (FILE *fPtr)
{
struct inventory data;
struct inventory blankRecord = {0,"",0,0};
int toolNumber;
printf("Enter record number to delete (1-100):");
scanf("%d", &toolNumber);
fseek( fPtr, (toolNumber-1)*sizeof(struct inventory), SEEK_SET);
fread ( &data, sizeof(struct inventory),1,fPtr);
if(data.number==0){
printf("Record %d does not exist.\n", toolNumber);
}
else{
fseek(fPtr, (toolNumber-1)*sizeof(struct inventory), SEEK_SET);
fwrite(&blankRecord, sizeof(struct inventory), 1, fPtr);
}
}
void List(FILE *readPtr)
{
struct inventory data = {0,"",0,0.00};
rewind(readPtr);
printf("%-12s%-13s%-10s%-10s\n", "Record#", "Tool Name", "Quantity", "Price\n");
while (!feof(readPtr)){
fread( &data, sizeof(struct inventory), 1, readPtr);
if (data.number !=0){
printf("%-12d%-13s%-10d%-10.2f\n\n", data.number, data.toolName, data.quantity, data.price );
}
}
}