BST写入文件异常求助:控制台输出正常但文件仅写入部分节点
问题分析与解决
你的问题核心是递归函数里过早关闭了文件流:
在saveTreeToFile函数中,file1.close();语句位于函数末尾,不属于if(r!=NULL)的分支。这意味着每一次递归调用该函数,不管当前节点是否为空,都会执行文件关闭操作。
第一次调用函数处理根节点时,写完根节点内容就直接关闭了文件流,后续递归处理左右子节点时,都是对已关闭的文件流进行写入操作,这些写入会全部失败,最终文件里只有前几个节点的内容;而cout是独立的标准输出流,不受文件关闭影响,所以控制台能完整打印所有节点。
修复步骤
- 删除
saveTreeToFile函数末尾的file1.close();语句:
void saveTreeToFile(node *r, ofstream &file1){ if(r!=NULL){ file1<<r->data<<" "<<r->count<<endl; cout<<r->data<<" "<<r->count<<endl; saveTreeToFile(r->left, file1); saveTreeToFile(r->right, file1); } // 移除这行代码:file1.close(); }
- 在主函数中,等所有节点写入完成后再关闭文件流:
int main(){ // ... 其他原有代码 ... ofstream file1; file1.open("out.txt"); saveTreeToFile(root,file1); file1.close(); // 移至此处执行关闭操作 }
修改后,文件流会在所有节点的写入操作完成后才关闭,就能完整写入所有BST节点的内容。
内容的提问来源于stack exchange,提问作者ian848
相关产品推荐
相关产品推荐

