如何从文本文件中删除特定的 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行。它匹配,但是假设当你要求验证时他们说否?您继续,但您没有向输出文件写入任何内容。
这一直持续到您说“是”为止。那时,您复制了剩余的行——但是您忽略了您跳过的行。
我认为您需要做的是将不匹配的行输出到您的输出文件。
此函数用于从数据库文本文件中删除特定行。
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行。它匹配,但是假设当你要求验证时他们说否?您继续,但您没有向输出文件写入任何内容。
这一直持续到您说“是”为止。那时,您复制了剩余的行——但是您忽略了您跳过的行。
我认为您需要做的是将不匹配的行输出到您的输出文件。