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

C++如何读取txt文件中begin与end标记间的内容并过滤指定分隔符

原代码问题

  • 逻辑流程错误:找到begin标记后仅读取一次内容就终止,没有持续读取内容直到遇到end标记,且未正确维护读取区间的状态
  • 缺少分隔符处理逻辑:未实现~~、!-!、??三类指定分隔符的移除功能
  • 语法不完整:main函数、else分支的大括号未闭合,且缺少<string>头文件引入,编译会报错
  • 输入操作混用:同时使用getline和>>读取文件,会导致换行符残留、内容读取丢失的问题

修复后的完整代码

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// 通用字符串替换函数
void replace_all(string& s, const string& from, const string& to) {
    size_t pos = 0;
    while ((pos = s.find(from, pos)) != string::npos) {
        s.replace(pos, from.size(), to);
        pos += to.size();
    }
}

int main() {
    ifstream my_file("file.txt", ios::in);
    if (!my_file.is_open()) {
        cout << "No such file" << endl;
        return 1;
    }

    string line;
    bool in_target = false; // 标记是否处于begin和end之间
    const string delims[] = {"~~", "!-!", "??"}; // 要移除的分隔符列表

    while (getline(my_file, line)) {
        // 遇到结束标记直接退出
        if (line == "end") {
            break;
        }
        // 遇到开始标记,开启处理状态,跳过当前行
        if (line == "begin") {
            in_target = true;
            continue;
        }
        // 不在处理区间内直接跳过
        if (!in_target) {
            continue;
        }
        // 移除所有指定分隔符
        for (const string& d : delims) {
            replace_all(line, d, "");
        }
        // 输出处理后的行,可根据需求调整是否保留换行
        cout << line << endl;
    }

    my_file.close();
    return 0;
}

实现说明

  • 新增状态变量标记是否处于begin和end的处理区间,区间外的内容直接跳过
  • 封装通用字符串替换函数,批量移除所有指定分隔符,后续需要新增要移除的字符直接更新delims数组即可
  • 统一使用getline按行读取文件,避免换行符处理异常
  • 补充完整的资源释放和返回值逻辑,程序健壮性更高

内容的提问来源于stack exchange,提问作者Phd student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:27:01