Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

replace line in a file C++

Tags:

c++

file

I'm trying to find a way to replace a line, containing a string, in a file with a new line.

If the string is not present in the file, then append it to the file.

Can someone give a sample code?

EDIT : is there anyway if the line that i need to replace is at the end of the file?

like image 873
Prasanth Madhavan Avatar asked Dec 21 '10 12:12

Prasanth Madhavan


2 Answers

Although I recognize that this is not the smartest way to do it, the following code reads demo.txt line by line and searches for the word cactus to replace it for oranges while writing the output to a secondary file named result.txt.

Don't worry, I saved some work for you. Read the comment:

#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.
}
like image 79
karlphillip Avatar answered Oct 22 '22 19:10

karlphillip


To replace the last two lines in your file:

  • Use fopen() to open the file
  • Get the current file position with fgetpos()
  • Store always the last two file position and read line by line
  • When you've reached the end of the file: The lower position is where you have to position to with fseek()
  • Now you can fprintf() your new lines to the file and close it with fclose() afterwards.
like image 1
ur. Avatar answered Oct 22 '22 19:10

ur.