我想在文本文件中搜索一个字符串,并在找到时删除整行。我想用C ++编写。
我尝试过使用C#解决方案,并且尝试创建临时文件。什么都不适合我。
到目前为止,这是我的代码:
void MainForm::WriteToTextFile(){
ifstream stream("text.txt");
string line;
bool found = false;
while (std::getline(stream, line) && !found)
{
if (line.find("Delete_This_Line") != string::npos){ // WILL SEARCH "Delete_This_Line" in file
found = true;
line.replace(line.begin(), line.end(), "\n");
stream.close();
}
我希望文本文件会被修改,但没有任何变化。
答案 0 :(得分:2)
您不向文件写入任何内容。
对于文本文件,您不能简单地“替换”文本,除非替换的长度与要替换的旧文本的长度完全相同。
解决问题的一种常见方法是从原始文件读取并写入临时文件。找到要替换的文本后,将新文本写入临时文件。完成后,您将关闭两个文件,并将临时文件重命名为原始文件,将其替换为新的修改内容。
答案 1 :(得分:0)
您只修改内存中的一个字符串,如何期望更改读取文件的内容?
请注意在关闭文件时继续尝试读入文件,在 getline()之后测试 found 太晚了,这样做更简单添加一个 break
答案 2 :(得分:0)
std::getline
将行复制到内存中的另一个字符串对象。修改该字符串不会更改文件的内容。
可能的解决方案是使用输入和输出文件流重新创建文件,并避免仅复制所需的行。这是一个未经测试的示例:
#include <fstream>
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
bool replace_line(string filename, string key, string new_content)
{
{
ifstream stream(filename);
ofstream ofs(filename + ".out");
string line;
bool found = false;
while (std::getline(stream, line))
{
if (line.find(key) != string::npos){
found = true;
ofs << new_content;
} else {
ofs << line;
}
}
}
remove(file);
rename(file + ".out", filename);
return found;
}