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

如何修改C++代码删除文件中所有以|开头且以|结尾的字符串?

C++实现删除文件中所有以|开头且以|结尾的字符串

原代码仅能删除固定的|start|字符串,现在需要修改为删除文件中所有格式为|xxx|(以|开头且以|结尾)的子串,同时处理一行中多次出现的情况。

原代码的局限在于仅针对单一固定字符串做单次查找删除,无法覆盖任意内容的|xxx|格式,也不会处理一行内多次出现的匹配项。以下是修改后的完整实现:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream in_file("Test-1.txt");
    std::ofstream out_file("output.txt");

    if (!in_file.is_open()) {
        std::cerr << "无法打开输入文件" << std::endl;
        return 1;
    }
    if (!out_file.is_open()) {
        std::cerr << "无法打开输出文件" << std::endl;
        return 1;
    }

    std::string str;
    while (std::getline(in_file, str)) {
        std::cout << "原行内容: " << str << std::endl;

        size_t start_pos = 0;
        // 循环处理一行中所有的|xxx|格式子串
        while ((start_pos = str.find('|', start_pos)) != std::string::npos) {
            // 从起始|的下一个位置开始找对应的结束|
            size_t end_pos = str.find('|', start_pos + 1);
            if (end_pos != std::string::npos) {
                // 删除从起始|到结束|(包含两者)的完整子串
                str.erase(start_pos, end_pos - start_pos + 1);
                // 删除后字符串长度变化,继续从当前位置查找下一个匹配
            } else {
                // 找不到对应的结束|,退出循环避免死循环
                break;
            }
        }

        std::cout << "处理后内容: " << str << std::endl;
        out_file << str << std::endl;
    }

    in_file.close();
    out_file.close();
    return 0;
}

关键修改说明

  • 增加文件校验:添加文件打开状态检查,避免程序在文件无法访问时静默失败或崩溃
  • 循环处理所有匹配:通过外层循环持续查找起始|,直到一行中没有更多符合格式的子串
  • 配对标记查找:找到起始|后,从下一个字符位置查找对应的结束|,确保删除完整的|xxx|结构
  • 适配字符串长度变化:删除子串后,从当前位置继续查找,避免跳过删除后新出现的匹配项

注意事项

  • 此代码处理非嵌套的|xxx|格式,若存在嵌套场景(如|abc|def|ghi|),会直接删除最外层的完整标记串;如需处理嵌套逻辑,需引入栈结构跟踪|的层级
  • 若一行中存在未闭合的|(仅开头有|无对应结尾),会忽略该不完整标记

内容的提问来源于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:31:12