我正试图从bin文件中删除一条记录。
我试图创建另一个指针,并创建一个临时文件以将数据写入其中,然后从临时文件中将数据写回到原始文件中。我想也许有一种更简单的方法。但是主要的问题是更新工资功能需要更改什么。
这是我到目前为止所做的。
因此,该计划的主要目标是,如果我输入的金额大于阈值,则应该删除该记录。有什么建议需要更新工资更新功能吗?
#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);
}
}
答案 0 :(得分:1)
主要问题是更新工资功能需要更改什么。
遵循Scheff的建议:将新文件重命名为原始文件的名称。为此,请更改
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);
到
fclose(f_temp);
fclose(f);
rename(filename, "Backup_file"); // optional, or maybe remove(filename);
rename("Final_file", filename);
除此之外,
scanf("%.2f",&amount);
的转换规范无效;也许你是说
scanf("%2f", &amount);