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
相关产品推荐
相关产品推荐

