替换文件C ++中的行

时间:2010-12-21 12:12:31

标签: c++ file

我正在尝试找到一种方法来替换包含字符串的行,并在一个新行的文件中。

如果文件中不存在该字符串,则将其附加到文件中。

有人可以提供示例代码吗?

编辑:无论如何,如果我需要替换的行位于文件的末尾?

4 个答案:

答案 0 :(得分:2)

虽然我认识到这不是最聪明的方法,但以下代码逐行读取 demo.txt 并搜索单词 cactus 以替换它将输出写入名为 result.txt 的辅助文件时, oranges

别担心,我为你节省了一些工作。阅读评论:

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;


int main()
{
  string search_string = "cactus";
  string replace_string = "oranges";
  string inbuf;
  fstream input_file("demo.txt", ios::in);
  ofstream output_file("result.txt");

  while (!input_file.eof())
  {
      getline(input_file, inbuf);

      int spot = inbuf.find(search_string);
      if(spot >= 0)
      {
         string tmpstring = inbuf.substr(0,spot);
         tmpstring += replace_string;
         tmpstring += inbuf.substr(spot+search_string.length(), inbuf.length());
         inbuf = tmpstring;
      }

      output_file << inbuf << endl;
  }

  //TODO: delete demo.txt and rename result.txt to demo.txt
  // to achieve the REPLACE effect.
}

答案 1 :(得分:1)

要替换文件中的最后两行:

  • 使用fopen()打开文件
  • 使用fgetpos()
  • 获取当前文件位置
  • 始终存储最后两个文件位置并逐行读取
  • 当您到达文件末尾时:较低的位置是您必须使用fseek()
  • 定位的位置
  • 现在,您可以fprintf()将新行添加到文件中,然后使用fclose()将其关闭。

答案 2 :(得分:1)

如上所述,KarlPhilip的代码是一个很好的起点(谢谢),但根据“&gt; = 0”无法正常工作。与“0”相比,MS CString类型和C#等已知,但似乎与STL无法正常工作。例如。在VS 2010(仅发布)中,C ++代码在这种比较中表现错误而没有抛出错误!

以下是对C ++标准的更正:如果某些向导有改进,请发布它们。我认为,这是一个非常有用和重要的问题/片段。

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;    

int main() 
{   
   string search_string = "cactus";   
   string replace_string = "oranges";   
   string inbuf;
   // Todo: Check, if input_file exists before. 
   // Todo: Try/catch or check, if you have write access to the output file.
   fstream input_file("demo.txt", ios::in);   
   ofstream output_file("result.txt");

   while (!input_file.eof())   
   {
      getline(input_file, inbuf);
      size_t foundpos = inbuf.find(search_string);
      if(foundpos != std::string::npos)
      {
         string tmpstring = inbuf.substr(0,spot);
         tmpstring += replace_string;
         tmpstring += inbuf.substr(spot+search_string.length(), inbuf.length());
         inbuf = tmpstring;
      }

      output_file << inbuf << endl;   
   }

   //TODO: delete demo.txt and rename result.txt to demo.txt      
   // to achieve the REPLACE effect. 
}

我在另一个SO问题的“if”中使用了以下替换部分 (上面的代码只替换第一次出现):

if(foundpos != std::string::npos)
   replaceAll(inbuf, search_string, replace_string); 

//http://stackoverflow.com/questions/3418231/c-replace-part-of-a-string-with-another-string
//
void replaceAll(std::string& str, const std::string& from, const std::string& to) 
{
    size_t start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) 
    {
        size_t end_pos = start_pos + from.length();
        str.replace(start_pos, end_pos, to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}

答案 3 :(得分:0)

如果要更改(或删除)文件中间一行的长度,则必须重新编写所有后续行。

无法简单地将字符删除或插入现有文件中。