C语言删除Bin文件中的一条记录
Deleting a record from a Bin File in C
我正在尝试从 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);
}
}
the main question is what to change in update salary function.
遵循 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);
我正在尝试从 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);
}
}
the main question is what to change in update salary function.
遵循 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);