C++删除多行文件指定字符串:单行有效多行抛异常如何修复?
修复多行文件删除指定字符串的C++代码问题
你的代码抛出异常的核心原因是:当某一行不包含目标字符串|start|时,line.find(deleteline)会返回string::npos(一个无效的位置标记),直接用这个值调用replace会触发越界错误。另外代码里还存在文件名不一致的问题——打开的是Test1.txt,但删除重命名的是Test-1.txt,会导致原文件无法被正确替换。
以下是修复后的代码:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string deleteline = "|start|"; string line; ifstream fin("Test1.txt"); if (!fin.is_open()) { cerr << "无法打开原文件" << endl; return 1; } ofstream temp1("temp.txt"); if (!temp1.is_open()) { cerr << "无法创建临时文件" << endl; fin.close(); return 1; } while (getline(fin, line)) { size_t pos = line.find(deleteline); // 只有找到目标字符串时才执行替换 if (pos != string::npos) { line.replace(pos, deleteline.length(), ""); } temp1 << line << endl; } temp1.close(); fin.close(); // 确保文件名一致,完成文件替换 if (remove("Test1.txt") != 0) { cerr << "删除原文件失败" << endl; return 1; } if (rename("temp.txt", "Test1.txt") != 0) { cerr << "重命名临时文件失败" << endl; return 1; } return 0; }
关键修复点:
- 添加存在性判断:每次调用
find后,先检查返回值是否为string::npos,只有找到目标字符串时才执行替换,避免无效位置导致的异常。 - 统一文件名:将删除和重命名的文件名改为和打开的
Test1.txt一致,确保原文件被正确替换。 - 增加文件打开校验:判断输入输出文件是否成功打开,避免后续操作在文件未打开的情况下执行,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Mudassir Waheed
相关产品推荐
相关产品推荐

