如何从二进制文件中删除结构?

时间:2014-04-27 12:58:37

标签: c

如果用户通过输入身份证号码指定要删除的员工,如何从二进制文件中删除员工?当用户输入ID时,我想删除与该员工相对应的所有信息。

struct EmployeeInformation {
    char Firstname[32];
    char Lastname[32];
    char Address[32];
    char ID[8];
    char Duration[8];
};

struct EmployeeInformation Employee;

void DeleteEmployee() {

    FILE *fd;
    char EmployeeID[8];

    printf("\n>>Delete Employee<<\n");

    //Ask user for ID of employee they wish to delete.
    printf("Employee ID:");
    fgets(EmployeeID, 6, stdin);

    if ((fd = fopen(BINARY_FILE, "rb")) == NULL) {
        printf("Error, Cannot Open File.\n");
    } else {
        fseek(fd, 0, SEEK_SET);
        fread(&Employee, sizeof(struct EmployeeInformation), 1, fd);

        if (strcmp(EmployeeID, Employee.ID) == 0) {

            //Employee Found

        } else {
            printf("Employe Not Found!\n");
        }
    }
    fclose(fd);
}

1 个答案:

答案 0 :(得分:3)

从文件中删除条目的最常用方法是通过在结构中放置一个标记来将其标记为已删除:

struct EmployeeInformation {
    char Firstname[32];
    char Lastname[32];
    char Address[32];
    char ID[8];
    char Duration[8];
    int deleted; // deleted!=0 means record deleted
};

如果您无法修改结构(可能是因为您已经有一个书面文件),解决方案可能是:每次需要删除操作时,将整个文件写入一个新文件,而不写入已删除的记录。

请注意,如果你有一个包含大量记录的文件,删除操作将花费你很多时间(用于重写新文件中的所有记录)。因此,我建议您使用标记将记录标记为已删除,有时(可能每周1次)重写whoole文件以删除已删除的记录。