I'm trying to delete a record from a bin file.
I tried to make another pointer and make a temp file to write the data into it and then from the temp file write the data back to the original file..I suppose there is maybe an easier way. but the main question is what to change in update salary function.
here is what I did so far.
So the main goal of the program is if I enter extra money that is bigger than the threshold I should remove the record. any suggestions what do I need to change in update salary function?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct employee
{
int code;
char name[15];
float salary;
} Employee;
void create_bin(char *f, float* threshold);
void updateSalary(char* filename, float threshold);
void Display(char *fName);
void main() {
char filename[20] = "input.bin";
float threshold;
create_bin(filename,&threshold);
Display(filename);
updateSalary(filename, threshold);
Display(filename);
getch();
}
void create_bin(char *f,float* threshold){
FILE *f_b;
Employee emp1;
int object=0,number,i=0;
float amount;
f_b = fopen(f, "wb+");
if (!f_b) {
printf("unable to open file");
}
printf("How many Employees?");
scanf("%d",&number);
for (i = 0; i < number; i++) {
printf("Eneter employee Code:");
scanf("%d",&emp1.code);
rewind(stdin);
puts("Enter name");
gets(emp1.name);
printf("Eneter employee Salary:");
scanf("%f",&emp1.salary);
rewind(stdin);
object += fwrite(&emp1, sizeof(Employee), 1, f_b);
}
printf("Ente threshold:");
scanf("%.2f",&amount);
*threshold = amount;
printf("Total elements in file %d\n", object);
fclose(f_b);
}
void updateSalary(char* filename, float threshold)
{
float extra_money;
int i = 1;
Employee emp;
FILE *f = fopen(filename,"rb+");
FILE *f_temp = fopen("Final_file","wb+");
if (!f)
{
printf("File not found!\n");
return 0;
}
if (!f_temp) {
printf("File not found!\n");
return 0;
}
fread(&emp, sizeof(Employee), 1, f);
while (!feof(f))
{
printf("Enter how much money to add to #%d worker:",i++);
rewind(stdin);
scanf("%f",&extra_money);
emp.salary+= extra_money;
if (emp.salary <= threshold) {
fwrite(&emp, sizeof(Employee), 1, f_temp);
}
fread(&emp, sizeof(Employee), 1, f);
}
fread(&emp, sizeof(Employee), 1, f_temp);
while (!feof(f_temp)) {
fwrite(&emp, sizeof(Employee), 1,f);
fread(&emp, sizeof(Employee), 1, f_temp);
}
fclose(f_temp);
fclose(f);
}
void Display(char *fName)
{
Employee emp;
FILE *f = fopen(fName, "rb");
if (f)
{
fread(&emp, sizeof(emp), 1, f);
while (!feof(f))
{
printf("%9d %15s %8.2f\n", emp.code, emp.name, emp.salary);
fread(&emp, sizeof(emp), 1, f);
}
fclose(f);
}
}
the main question is what to change in update salary function.
Follow Scheff's good advice: Rename the new file to name of original file. To do so, change
fread(&emp, sizeof(Employee), 1, f_temp);
while (!feof(f_temp)) {
fwrite(&emp, sizeof(Employee), 1,f);
fread(&emp, sizeof(Employee), 1, f_temp);
}
fclose(f_temp);
fclose(f);
to
fclose(f_temp);
fclose(f);
rename(filename, "Backup_file"); // optional, or maybe remove(filename);
rename("Final_file", filename);
Besides that,
scanf("%.2f",&amount);
has an invalid conversion specification; perhaps you meant
scanf("%2f", &amount);