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; } }
额外注意事项
- 遍历逻辑一致性:原代码注释写的是“Viajar izquierda(访问左)”,但实际调用的是
root->right,如果需要按BST升序遍历,需调整为:先递归左子树,再写入节点,最后递归右子树;如果是降序遍历则保留原逻辑。 - 成员变量合法性:确保
NodeTree的line和data成员类型支持ofstream输出(比如是字符串、整数等基础类型)。 - 文件权限与路径:确认程序运行目录下有写入权限,若使用绝对路径需保证路径正确。
内容的提问来源于stack exchange,提问作者Marcelo Villanueva
相关产品推荐
相关产品推荐

