【问题标题】:How do I delete a structure from a binary file?如何从二进制文件中删除结构?
【发布时间】:2014-06-12 23:23:15
【问题描述】:

在用户通过输入 ID 号指定要删除的员工后,如何从二进制文件中删除员工?当用户输入 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 是在没有相关记录的情况下重写文件。 2 是以某种方式将记录标记为已删除(您需要在其他比较/搜索等中考虑这一点)
  • @Joe 如果我要在第一个字节处使用“”作为已删除员工的标记。如何将 '' 写入要删除的员工的第一个字节。
  • @Joe 是对的,最好的方法是将您的记录标记为未使用,并可选择关闭未使用条目的文件。后一个过程可以定期进行。
  • @StephenFox 使用“rb+”作为模式。
  • @StephenFox 真的需要使用原始二进制文件来存储常规数据吗?更好的选择是使用数据库。有例如sqlite3 具有 C 语言绑定的数据库,并将数据存储在一个二进制文件中(不需要网络、服务器或任何类似的东西)。你只需要弄清楚如何使用这个库(不超过十几个函数)并编写简单的 SQL 查询。 Sqlite3 自己做所有的替换,记录删除等。

标签: c


【解决方案1】:

从文件中删除条目的最常见方法是通过在结构中放置一个标志来将其标记为已删除,如下所示:

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 次)重写整个文件以删除已删除的记录。

【讨论】:

  • 通常你不会为此添加额外的字段。只需将其归零就应该设置多个无效/已删除标志。
  • @Deduplicator 在这种情况下你是对的,但有时,例如当你的结构有整数时,0 是一个有效值,所以你无法区分有效结构和已删除的结构
  • 实际上,为了有效性,您不看 C 类型,而是看语义类型。因此,没有无效值的记录定义非常罕见。 (所以我通常是轻描淡写)
猜你喜欢
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2015-02-27
  • 2012-06-11
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多