将二进制搜索树保存到磁盘

时间:2013-01-10 03:40:08

标签: c binary-tree

当尝试将树的内容保存到文件时,没有保存任何内容,我不知道为什么。 这些是我正在进行的函数调用:

insert(tree, cust.id, filePos);
saveTree(tree, "cIndex.dat", 0);

这些是涉及的功能:

struct NODE *insert(struct NODE *node, char info[], int pos) 
{ 
int length = strlen(info);
// 1. If the tree is empty, return a new, single node 
if (node == NULL) 
{ 
    struct INFO stuff; 
    //stuff = (struct INFO*)malloc(sizeof(struct INFO));

    strncpy(stuff.data, info, DATA_LENGTH);
    stuff.filePos = pos;

    node = malloc(sizeof(struct NODE));

    node->data = stuff; 
    node->left = NULL; 
    node->right = NULL;

    return(node); 

}    

else 
{ 
    // 2. Otherwise, recur down the tree 
    if (strncmp(info, node->data.data, length) <= 0) 
    {
        node->left = insert(node->left, info, pos); 
    }

    else 
    {
        node->right = insert(node->right, info, pos);
    }

    return(node); // return the (unchanged) node pointer 
} 
}


int saveTree(struct NODE *node, char filename[], int posInFile) 
{
FILE *file;
file = fopen(filename, "r+b"); //r+ so as to overwrite existing data instead of appending

char c;
char posStr[POS_LENGTH];

fseek(file, posInFile, SEEK_SET);

while((c = fgetc(file)) != EOF)
{
    if(node != NULL)
    {
        fseek(file, -1, SEEK_CUR);

        fwrite(node->data.data, sizeof(char), DATA_LENGTH, file);
        sprintf(posStr, "%d", node->data.filePos); 
        fwrite(posStr, sizeof(char), POS_LENGTH, file);

        posInFile = ftell(file);

        saveTree(node->left, filename, posInFile);
        saveTree(node->right, filename, posInFile);
    }
}

fclose(file);

return 1;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这可能是一些事情。从您上一个问题开始,我注意到您实际上并未存储您创建的树(在loadTree中)。你修好过吗?

但只是查看你的保存功能......你应该打开文件一次并递归传递FILE*。为方便起见,请在外面执行并传递FILE*而不是名称。您正在使用缓冲输出而不进行刷新,否则您将遇到麻烦。

int saveTree( struct NODE *node, FILE *fp );

// ...

FILE *fp = fopen( filename, "wb" );
saveTree( tree, fp );
fclose(fp);

您是否有理由使用文本值编写二进制文件?您确定不想在文本模式下打开并使用fprintf吗?