gpt4 book ai didi

c - 将二叉树保存到 C 中的文件中

转载 作者:行者123 更新时间:2023-11-30 17:55:36 25 4
gpt4 key购买 nike

我目前正在执行一个客户程序,用户可以添加/编辑/搜索/列出客户。我决定使用二叉树作为该程序的 Backbone 。我的想法是在程序关闭之前将树中的每个项目保存到“customers.dat”,然后在启动时加载从文件到树的所有内容。到目前为止一切顺利,但是在最终设法将二叉搜索树保存到文件中之后,我遇到了一个错误。

假设我第一次添加 3 个客户。然后我关闭该程序,当我重新打开它时,我会在树中找到相同的 3 个客户。但是,下次我打开该文件时,它会给我一个来自预定义错误的错误,当节点无法识别是向左还是向右时,可能会因为它为空或无法比较而发生这种情况。这是一些代码片段。我也尝试使用除 a+b 之外的其他文件打开技术,并且没有出现此类错误,但是通过我设计程序的方式,我需要追加方法,否则只会保存一条记录。

客户存储在 Cstmr 的 header 中:

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);
}

最佳答案

问题是您总是将所有数据附加到同一个文件中......因此上次运行的所有内容都会重复。

一种解决方案是在使用当前方法保存数据之前删除(取消链接)文件。

但是,正如 Freezerburn 之前指出的那样,不打开和关闭每个项目的文件会更经济。只需以覆盖模式(即不追加)打开文件一次,然后写入所有数据,然后关闭文件。也应该快得多。

另一个问题是您以二进制格式保存数据。尝试定义一种易于阅读的文本格式。这会让问题变得显而易见......

关于c - 将二叉树保存到 C 中的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com