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

