You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BST写入文件异常求助:控制台输出正常但文件仅写入部分节点

问题分析与解决

你的问题核心是递归函数里过早关闭了文件流:
在saveTreeToFile函数中,file1.close();语句位于函数末尾,不属于if(r!=NULL)的分支。这意味着每一次递归调用该函数,不管当前节点是否为空,都会执行文件关闭操作。

第一次调用函数处理根节点时,写完根节点内容就直接关闭了文件流,后续递归处理左右子节点时,都是对已关闭的文件流进行写入操作,这些写入会全部失败,最终文件里只有前几个节点的内容;而cout是独立的标准输出流,不受文件关闭影响,所以控制台能完整打印所有节点。

修复步骤

  1. 删除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();
}
  1. 在主函数中,等所有节点写入完成后再关闭文件流:
int main(){
        // ... 其他原有代码 ...
        ofstream file1;
        file1.open("out.txt");
        saveTreeToFile(root,file1);
        file1.close(); // 移至此处执行关闭操作
}

修改后,文件流会在所有节点的写入操作完成后才关闭,就能完整写入所有BST节点的内容。

内容的提问来源于stack exchange,提问作者ian848

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:35:18