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

std::ofstream无法将二叉搜索树(BST)内容写入文件求助

问题分析与解决方案

你的代码核心问题在于递归函数内重复创建并打开同一个文件流:每次调用outAccess时,都会新建ofstream对象打开salidaOrdenadaAccess.txt,默认打开方式会清空原文件内容。加上递归过程中频繁打开/关闭文件,最终只有最后一个被访问的节点内容会保留,甚至可能因文件资源冲突导致写入失败。

修复方案

将文件流的创建和打开逻辑移到递归函数外部,仅在顶层打开一次,递归过程中复用同一个文件流对象:

修改后的代码

// 递归辅助函数:接收已打开的文件流引用
void outAccessHelper(NodeTree* root, ofstream& outFile) {
    if (root == NULL) {
        return;
    }
    // 原代码注释与实际调用节点相反,若需升序遍历请改为 root->left
    outAccessHelper(root->right, outFile);
    // 写入当前节点数据
    outFile << root->line << " Numero de accesos " << root->data << endl;
    cout << "Mando" << root->line << endl;
    // 原代码注释与实际调用节点相反,若需升序遍历请改为 root->right
    outAccessHelper(root->left, outFile);
}

// 顶层函数:负责打开/关闭文件,触发递归
void outAccess(NodeTree* root) {
    ofstream outFileP5("salidaOrdenadaAccess.txt");
    if(outFileP5.is_open()) {
        outAccessHelper(root, outFileP5);
        outFileP5.close();
    } else {
        cout << "no jalo" << endl;
    }
}

额外注意事项

  1. 遍历逻辑一致性:原代码注释写的是“Viajar izquierda(访问左)”,但实际调用的是root->right,如果需要按BST升序遍历,需调整为:先递归左子树,再写入节点,最后递归右子树;如果是降序遍历则保留原逻辑。
  2. 成员变量合法性:确保NodeTree的line和data成员类型支持ofstream输出(比如是字符串、整数等基础类型)。
  3. 文件权限与路径:确认程序运行目录下有写入权限,若使用绝对路径需保证路径正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:40:31