如何修改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
相关产品推荐
相关产品推荐

