用C语言将二叉树结构写入文件

用C语言将二叉树结构写入文件,c,binary-search-tree,C,Binary Search Tree,嗨,我正在尝试将我的BST内容写入一个文件。到目前为止,我没有运气,因为它只打印根,其他什么都没有 我的树结构是这样的 typedef struct node { char *Emp; struct node *left; struct node *right; }mynode; void export(mynode *root) { File *fp fp=fopen("Names.txt","w"); if(root!=NULL) { export(root->left); fpr

嗨,我正在尝试将我的BST内容写入一个文件。到目前为止,我没有运气,因为它只打印根,其他什么都没有

我的树结构是这样的

typedef struct node
{
char *Emp;
struct node *left;
struct node *right;
}mynode;
void export(mynode *root)
{
File *fp
fp=fopen("Names.txt","w");

if(root!=NULL)
{
export(root->left);
fprintf(fp,root->Emp);
export(root->right);
}
fclose(fp);
}
我的代码是这样的

typedef struct node
{
char *Emp;
struct node *left;
struct node *right;
}mynode;
void export(mynode *root)
{
File *fp
fp=fopen("Names.txt","w");

if(root!=NULL)
{
export(root->left);
fprintf(fp,root->Emp);
export(root->right);
}
fclose(fp);
}

我尝试使用printf来查看它是否打印了它,并且它确实打印了。问题是它在递归调用之后不会写入任何内容,即使我放置了其他无意义的fprintf语句。

问题可能是您每次都在export()函数的顶部创建一个新文件

您要做的是首先创建文件并将句柄传递给导出函数。例如:

void导出(mynode*root)
{
文件*fp
fp=fopen(“Names.txt”,“w”);
导出递归(fp,root);
fclose(fp);
}
void export_recursive(文件*fp,mynode*根)
{
if(root!=NULL)
{
导出递归(根->左);
fprintf(fp,root->Emp);
导出递归(根->右);
}
}

问题可能是您每次都在export()函数的顶部创建一个新文件

您要做的是首先创建文件并将句柄传递给导出函数。例如:

void导出(mynode*root)
{
文件*fp
fp=fopen(“Names.txt”,“w”);
导出递归(fp,root);
fclose(fp);
}
void export_recursive(文件*fp,mynode*根)
{
if(root!=NULL)
{
导出递归(根->左);
fprintf(fp,root->Emp);
导出递归(根->右);
}
}

编辑:Tanguy打败了我。虽然他的代码确实有效,但我认为最好让文件打开到另一个函数

问题是您试图打开一个已经打开的文件,因此
fopen
失败并返回
null
。相反,您可以这样做:

void export(mynode *root) {
  File *fp;
  fp=fopen("Names.txt","w");

  exportHelper(root, fp);

  fclose(fp);
}

void exportHelper(mynode *root, File *fp) {
  if(root!=NULL) { 
    exportHelper(root->left, fp);
    fprintf(fp,root->Emp);
    exportHelper(root->right, fp);
  }
}

编辑:Tanguy打败了我。虽然他的代码确实有效,但我认为最好让文件打开到另一个函数

问题是您试图打开一个已经打开的文件,因此
fopen
失败并返回
null
。相反,您可以这样做:

void export(mynode *root) {
  File *fp;
  fp=fopen("Names.txt","w");

  exportHelper(root, fp);

  fclose(fp);
}

void exportHelper(mynode *root, File *fp) {
  if(root!=NULL) { 
    exportHelper(root->left, fp);
    fprintf(fp,root->Emp);
    exportHelper(root->right, fp);
  }
}

您不断地打开文件并对其进行缩放(
“w”
将文件归零),向其写入一些节点,并关闭当前版本的函数。您需要在递归写入函数之外执行打开和关闭操作。您要多次重新打开同一文件。每次递归调用一次。这当然不是你想要的。所有递归调用都应该使用相同的
fp
。您不断打开文件并对其进行重映射(
“w”
将文件归零),向其写入一些节点,并关闭当前版本的函数。您需要在递归写入函数之外执行打开和关闭操作。您要多次重新打开同一文件。每次递归调用一次。这当然不是你想要的。所有递归调用都应该使用相同的
fp
。欢迎使用堆栈溢出。第一个回答很好。我建议当前在函数外部的代码片段应该写在函数中,并且可能应该调用添加的函数
export()
,并将固定递归函数重命名为
export\u recursive()
或您选择的其他名称。欢迎使用堆栈溢出。第一个回答很好。我建议当前在函数外部的代码片段应该写在函数中,并且可能添加的函数应该调用
export()
,固定递归函数应该重命名为
export\u recursive()
或您选择的其他名称。