You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用C++通过单个单词搜索删除文本文件中的对应整行?

解决C++中按单个单词匹配删除文本整行的问题

嘿,我来帮你搞定这个问题!你的现有代码没法实现需求的原因很简单——它在做整行和输入单词的完全匹配,而不是检查当前行里是否包含目标单词。咱们来调整一下逻辑,就能实现“只要行内有指定单词就删除整行”的功能。

修改后的完整代码

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm> // 用于可选的大小写忽略功能

using namespace std;

int main() {
    string targetWord;
    string line;
    ifstream fin("example.txt");
    ofstream temp("temp.txt");

    // 增加文件打开失败的判断,避免程序崩溃
    if (!fin.is_open() || !temp.is_open()) {
        cerr << "无法打开文件,请检查路径是否正确!" << endl;
        return 1;
    }

    cout << "Enter word: ";
    cin >> targetWord;

    while (getline(fin, line)) {
        // 核心逻辑:检查当前行是否包含目标单词
        if (line.find(targetWord) == string::npos) {
            // 如果不包含目标单词,就把该行写入临时文件
            temp << line << endl;
        }
        // 要是包含的话,就跳过不写入,相当于删除了该行
    }

    // 关闭文件流
    temp.close();
    fin.close();

    // 替换原文件
    remove("example.txt");
    rename("temp.txt", "example.txt");

    return 0;
}

关键修改点说明

  • 使用string::find()方法:这个函数会在line中查找targetWord的位置,如果找到就返回起始索引;如果没找到,会返回string::npos这个特殊值。我们通过判断是否等于npos,来决定要不要把该行保留到临时文件里。
  • 增加错误处理:原代码没有处理文件打不开的情况,比如文件不存在或者权限不足时会直接崩溃,现在添加了判断,能给用户提示错误信息。

可选进阶:忽略大小写匹配

如果你需要不管大小写都能匹配(比如输入"Delete"也能删掉含"delete"的行),可以先把行文本和目标单词都转换成小写,再进行查找:

// 辅助函数:把字符串转成全小写
string toLowerCase(string str) {
    transform(str.begin(), str.end(), str.begin(), ::tolower);
    return str;
}

// 修改循环内的判断逻辑
while (getline(fin, line)) {
    string lowerLine = toLowerCase(line);
    string lowerTarget = toLowerCase(targetWord);
    if (lowerLine.find(lowerTarget) == string::npos) {
        temp << line << endl;
    }
}

这样调整后,就能完全满足你的需求啦!

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

火山引擎 最新活动