【问题标题】:Deleting a record from a Bin File in C从 C 中的 Bin 文件中删除记录
【发布时间】:2019-06-30 20:16:16
【问题描述】:

我正在尝试从 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);
        }
    }

【问题讨论】:

  • 首先从不在财务计算中使用浮点数。
  • 其次不要从文件中删除。开玩笑让它无效或免费。它需要更多的数据结构逻辑。
  • P__J__ 这是我需要的。给出了结构,我必须从 bin 文件中删除这是我被要求的。
  • 这是我认为更安全的方法:读取原始文件并写入新文件。完成后将原始文件重命名为原始文件名 + ".bak"。将新文件重命名为原始文件的名称。然后删除原始文件。有了这个概念,如果出现任何问题,您总是至少有一个完整的文件。 (可能需要双磁盘空间,我会考虑投资于安全性。)顺便说一句。几十年前我从 Turbo Pascal IDE 中学到了这一点...... ;-)

标签: c file bin


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多