首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用C语言将二叉树保存到文件中

用C语言将二叉树保存到文件中
EN

Stack Overflow用户
提问于 2013-01-07 05:57:18
回答 1查看 2.4K关注 0票数 0

我目前正在做一个客户程序,当用户可以添加/编辑/搜索/列出客户。我决定使用二叉树作为这个程序的主干。我的想法是在程序关闭之前将树中的每个项目保存到"customers.dat“中,然后在启动时将文件中的所有内容加载到树中。到目前为止一切顺利,但是在最终设法将二进制搜索树保存到一个文件中之后,我有一个bug。

假设我第一次添加了3个客户。然后我关闭程序,当我重新打开它时,我将在树中找到相同的3个客户。然而,下一次我打开文件时,它会给我一个来自预定义错误的错误,当一个节点无法确定是向左还是向右时,可能是因为它是空的或不可比较的。下面是一些代码片段。我也尝试过使用a+b之外的其他文件打开技术,我没有遇到这样的错误,但是按照我设计程序的方式,我需要append方法,否则只会保存一条记录。

客户存储在Cstmr的header中:

代码语言:javascript
运行
复制
typedef struct customer
{
    char Name[MAXNAME];
    char Surname[MAXNAME];
    char ID[MAXID];
    char Address[MAXADDRESS];

} Cstmr;

否则:

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-07 06:34:27

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14187229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档