【发布时间】: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