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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:15:44