当用户可以添加/编辑/搜索/列出客户时,我正在执行客户计划。我决定使用二叉树作为该程序的主干。我的想法是在程序关闭之前将树中的每个项目保存到“customers.dat”,然后在启动时加载从文件到树的所有内容。到目前为止一直很好,但是在最终设法将二进制搜索树保存到文件后,我有一个错误。
假设我第一次添加了3个客户。然后我关闭程序,当我重新打开它时,我会在树中找到相同的3个客户。但是,下次打开文件时,它会从我的一个预定义错误中给出一个错误,当一个节点无法识别是向左还是向右时,可能是因为它是空的或无法比较的。这里有一些代码片段。我也试过使用除了+ b之外的其他文件开放技术,我没有这样的错误,但是通过我设计程序的方式,我需要append方法,否则只会保存一条记录。
客户存储在标头中的Cstmr中:
typedef struct customer
{
char Name[MAXNAME];
char Surname[MAXNAME];
char ID[MAXID];
char Address[MAXADDRESS];
} Cstmr;
否则:
void CustomerTreeToFile(Tree*pt)
{
if (TreeIsEmpty(pt))
puts("Nothing to save!");
else
Traverse(pt,saveItem); //Traverses each node, and appliess the function
//saveItem to each node
}
void saveItem(Cstmr C)
{
save = C;
customers = fopen("customers.dat","ab+");
fwrite(&C,sizeof (Cstmr), 1, customers);
fclose(customers);
}
答案 0 :(得分:0)
问题是您总是将所有数据附加到同一个文件中...因此上一次运行的所有内容都是重复的。
一种解决方案是在使用当前方法保存数据之前删除(取消链接)文件。
然而,正如Freezerburn先前指出的那样,不打开和关闭每个项目的文件更经济。只需在覆盖模式下打开文件一次(即不附加),然后写入所有数据,然后关闭文件。也应该快得多。
另一个问题是您以二进制格式保存数据。尝试定义易于阅读的文本格式。那会让问题变得明显......