如何在C ++中删除文本文件中的特定行?

时间:2018-12-27 11:22:53

标签: c++

我想在文本文件中搜索一个字符串,并在找到时删除整行。我想用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();
      }

我希望文本文件会被修改,但没有任何变化。

3 个答案:

答案 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;
}