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

C++如何从文本文件中提取BEGIN到END之间的内容?

提取文本中BEGIN到END之间的内容

嘿,我完全懂你的困扰——getline()确实只能用单个字符当分隔符,对付这种多字符的标记确实不太顺手。不过咱们可以换个思路:先把整个文件内容读到一个字符串里,再通过查找BEGIN和END这两个标记来精准提取中间的内容,具体步骤和代码如下:

步骤1:将整个文件读入字符串

用std::stringstream可以很方便地把文件内容一次性读取到字符串中,这样后续的查找操作会灵活很多:

std::ifstream file("your_file.txt");
if (!file.is_open()) {
    std::cerr << "无法打开文件!" << std::endl;
    return 1;
}

std::stringstream buffer;
buffer << file.rdbuf();
std::string content = buffer.str();

步骤2:循环查找并提取BEGIN-END块

接下来我们可以用std::string的find()方法定位每一组BEGIN和END的位置,然后用substr()提取中间内容:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

int main() {
    // 读取文件内容
    std::ifstream file("your_file.txt");
    if (!file.is_open()) {
        std::cerr << "无法打开文件!" << std::endl;
        return 1;
    }

    std::stringstream buffer;
    buffer << file.rdbuf();
    std::string content = buffer.str();

    std::vector<std::string> extracted_strings;
    size_t current_pos = 0;

    while (true) {
        // 查找"BEGIN "的位置(带空格是为了避免误匹配类似BEGINNING的字符串)
        size_t begin_mark = content.find("BEGIN ", current_pos);
        if (begin_mark == std::string::npos) {
            break; // 没有更多BEGIN标记,退出循环
        }

        // 跳过"BEGIN ",定位到内容起始点
        size_t content_start = begin_mark + 6; // "BEGIN "的长度是6

        // 从内容起始位置开始找对应的" END"
        size_t end_mark = content.find(" END", content_start);
        if (end_mark == std::string::npos) {
            break; // 找不到对应END,退出循环
        }

        // 提取中间的内容
        std::string segment = content.substr(content_start, end_mark - content_start);
        extracted_strings.push_back(segment);

        // 更新当前位置,准备查找下一组
        current_pos = end_mark + 4; // " END"的长度是4
    }

    // 输出结果
    for (const auto& str : extracted_strings) {
        std::cout << "\"" << str << "\"" << std::endl;
    }

    return 0;
}

代码细节说明

  • 我特意用"BEGIN "和" END"作为查找标记(带空格),是为了避免误匹配到包含关键字的其他字符串(比如BEGINNING或者ENDLESS)。如果你的文本里标记和内容之间没有空格,可以把查找字符串改成"BEGIN"和"END",同时调整偏移量(比如BEGIN长度是5,那么content_start = begin_mark + 5)。
  • 这个循环会自动遍历所有的BEGIN-END块,直到找不到更多标记为止,最终提取的字符串会存在extracted_strings这个vector里,你可以直接取用。
  • 这种方法比逐行读取更可靠,哪怕BEGIN和END不在同一行也能正常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:32