如何从文本文件中删除特定的 line/string (fstream/c++)

How to delete a specific line/string from a text file (fstream/c++)

此函数用于从数据库文本文件中删除特定行。

void removeEntry() {
    fstream outputFile("outputFileName", std::fstream::in | std::fstream::out | std::fstream::app);
    fstream database("database", std::fstream::in | std::fstream::out | std::fstream::app);
    string line;
    string find;
    string var;
    cout << "Search for the entry you want to remove (type, category, amount, date [02-21-2021]): ";
    cin.ignore(256, '\n');
    getline(cin, find);

    while(getline(database, line)){
        if(line.find(find) != string::npos) {
            var = line;
            cout << line << endl;
            string choice{};
            cout << "Is this the line you want to delete[y/n]: ";
            cin >> choice;  

            if (choice =="y")
            {
                while(getline(database, line)){
                    if(line != var){
                        outputFile << line << endl;
                    }
                }
                database.close();
                outputFile.close();
                remove("database");
                rename("outputFileName","database");
            } else {
                continue;
            }
        } 
    }
}

数据库文本文件格式如下:

Expense, Transportation, , 02-08-2021
Income, Salary, 00, 02-09-2021
Expense, Food, 7, 02-10-2021

例如,如果我 运行 程序并尝试删除第一行,它会起作用,但如果我尝试仅删除第二行,它将同时删除第一行和第二行。我知道解决方案可能很简单,但它让我头疼。我可以提供任何需要的进一步细节,谢谢!

让我们考虑一下您的程序的结构:

while(getline(database, line)){
    if(line.find(find) != string::npos) {
        var = line;
        cout << line << endl;
        string choice{};
        cout << "Is this the line you want to delete[y/n]: ";
        cin >> choice;  

        if (choice =="y")
        {
            while(getline(database, line)){
                if(line != var){
                    outputFile << line << endl;
                }
            }
            database.close();
            outputFile.close();
            remove("database");
            rename("outputFileName","database");
        } else {
            continue;
        }
    } 
}

想想你要做什么。您已要求删除该行的文本。您正在阅读台词。

你读了第 1 行。假设它不匹配。你继续。你不写第一行。

你读了第2行。它匹配,但是假设当你要求验证时他们说否?您继续,但您没有向输出文件写入任何内容。

这一直持续到您说“是”为止。那时,您复制了剩余的行——但是您忽略了您跳过的行。

我认为您需要做的是将不匹配的行输出到您的输出文件。