C ++ Читать файл и заменить - PullRequest
0 голосов
/ 14 января 2012

Я хотел бы прочитать файл, который имеет несколько строк, а затем найти определенную строку, если эта строка найдена, я хотел бы заменить эту строку каким-либо другим значением, как мне это сделать?

Вот что есть сейчас:

#include <string>

using namespace std;

int main()
  {
  string line;

  ifstream myfile( "file.txt" );

  if (myfile) 

    {
    while (getline( myfile, line ))  
      {
      if (line == "my_match")
        {
        //cout << "found";
        ... here i would like to replace "my_match" with some other value
        }
      }
    myfile.close();
    }
  else cout << "error";

  return 0;
  }

Ответы [ 3 ]

2 голосов
/ 14 января 2012

Я согласен с Полом - Perl хорош:

  #!/usr/bin/perl -i.bak

  while (<>) {
     if (/^my_match$/) {
        print "replaced_line\n";
     } else {
        print "$_";
     }
  }

-i.bak автоматически заменит файл, который вы читаете, и создаст резервную копию с расширением .bak.

sed лучше:

sed -i 's/^my_match$/replace_text/' file.txt

Однако в C почему бы не записать свои строки в стандартный вывод, а не переписать файл. Затем используйте файл directions / bash для записи нового файла?

Если вы должны сделать это на C ++, чтение в память, а затем запись - один из вариантов (при условии, что ваш файл никогда не будет слишком большим):

  #include <string>
  #include <iostream>
  #include <fstream>
  #include <vector>

  using namespace std;

  int main()
  {
    string line;
    vector<string> buffer;

    ifstream in( "file.txt" );
    while (getline(in, line)) {
        buffer.push_back( (line == "my_match") ? "REPLACED" : line );
     }
     in.close();

     ofstream out("file.txt");
     for (vector<string>::iterator it = buffer.begin(); it!=buffer.end(); it++) {
        out << *it << endl;
     }

    return 0;
  }

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

0 голосов
/ 14 января 2012

Если вы хотите получить комментарии о том, как сделать код более точным, Code Review - это то место, где вы хотите быть.

Предполагая, что вы работаете со стандартным вводом и выводом и будете выполнять перенаправление и тому подобное на другом языке: да, то, что вы делаете, является возможным решением. Вы не говорите нам, что вы хотите заменить, но это должно сработать:

if (line == "my match")
    std::cout << "my replacement\n";
else
    std::cout << line << '\n';

Я бы сказал, что самая большая проблема в том, что она не очень общая; если вы хотите сопоставить только строку в зависимости от более сложного предиката, лучше всего написать для этого специальную функцию (или регулярное выражение); То же самое для замены зависит от линии. Например, в вашем цикле вы могли бы иметь:

std::cout << make_replacement(line);

И тогда вы можете определить:

std::string make_replacement(std::string const& line) {
    // some logic to construct a new string based on the line
}

Обратите внимание, что при этом создается копия для каждой строки, которая может быть дорогой (зависит от требований и размера файла).

0 голосов
/ 14 января 2012

Читайте файл построчно в вектор. Измените строку, которую хотите изменить, а затем удалите исходный файл, создайте новый и запишите все обратно.

...