заменить строку в файле C ++ - PullRequest
4 голосов
/ 21 декабря 2010

Я пытаюсь найти способ заменить строку, содержащую строку, в файле новой строкой.

Если строка отсутствует в файле, добавьте ее в файл.

Может кто-нибудь дать пример кода?

РЕДАКТИРОВАТЬ: есть ли в любом случае, если строка, которую мне нужно заменить, находится в конце файла?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2010

Хотя я признаю, что это не самый умный способ сделать это, следующий код читает demo.txt строка за строкой и ищет слово кактус , чтобы заменить его на апельсины при записи вывода во вторичный файл с именем result.txt .

Не беспокойся, я сохранил для тебя работу. Прочитайте комментарий:

#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 голос
/ 20 августа 2013

Как уже упоминалось, код от KarlPhilip является хорошей отправной точкой (спасибо), но не работает должным образом в соответствии с "> = 0".По сравнению с «0» он известен для MS CString-types и в 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(foundpos != std::string::npos)
   replaceAll(inbuf, search_string, replace_string); 

///2625749/zamenit-chast-stroki-drugoi-strokoi
//
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'
    }
}
1 голос
/ 21 декабря 2010

Чтобы заменить две последние строки в вашем файле:

  • Используйте fopen(), чтобы открыть файл
  • Получить текущую позицию файла с помощью fgetpos()
  • Сохранять всегда последние две позиции файла и читать построчно
  • Когда вы достигли конца файла: нижняя позиция - это позиция, с которой вы должны позиционировать fseek()
  • Теперь вы можете fprintf() ваши новые строки в файле и затем закрыть его с помощью fclose().
0 голосов
/ 21 декабря 2010

Если вы хотите изменить длину (или удалить) строку в середине файла, вам придется переписать все последующие строки.

Нет способа просто удалить или вставить символы в существующий файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...