Как использовать replace() и find()

У меня есть файл, я его открываю для прочтения, записываю все из него в str. Я нашла значения, которые мне нужно поменять через функцию find(). Как реализовать те значения, что дала мне функция find(), чтобы заменить через replace()?

#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
    setlocale(0, "");
    ifstream fout("input1.txt");
    ofstream mout("output1.txt");
    while (fout) {
        string str, s3;
        getline(fout, str);
        string s1 = "v obchem";
        string s2 = "koroche";
        int p = str.find(s1);
        s3 = str.replace("v obchem", "koroche", p);
    }   
}

Ответы (1 шт):

Автор решения: S.H.

Работа функции replace в C++ непохожа на её реализацию в языках программирования php или C#.

Разница - в том, что эта функция более "низкоуровневая". В отличие от ситуации, когда Вы говорите "вот строка, вот образец, а вот - то, на что нужно его заменить" в функции replace Вы говорите только про одно место в строке "вот место, в котором нужно вот столько то симолов заменить вот на такую то строку".

Соответственно, если в строке образец для замены встречается более одного раза - то приходится вызывать функцию replace несколько раз - по одному разу на каждое вхождение образца.

Именно это реализует вложенный цикл в примере, котрый приведен ниже.

в самом начале мы проверяем, что есть хотя бы одно вхожденеи образца в строку, если его нет - то выходим из цикла, это реализуется строкой

if (p == std::string::npos) break;

И, по справедливому замечанию Qwertiy я поменял считывание из файла при помощи getline()

Также, по предложению wololo в комментариях я поменял тип переменной, предназначенной для поиска позиции образца в строке.

Подучается примерно так:

    #include <fstream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main() {
        setlocale(0, "");
        ifstream fout("input1.txt");
        ofstream mout("output1.txt");
        
        string s1 = "v obchem";
        string s2 = "koroche";
        long long p=-1;
        string str;
     
        while (getline(fout, str)) {
            
            while (true) {
                /* Locate the substring to replace. */
                p = str.find(s1);
                if (p == std::string::npos) break;

                /* Make the replacement. */
                str.replace(p, s1.length(), s2);

                /* Advance index forward so the next iteration doesn't pick it up as well. */
                p += s2.length();
            }
            mout << str << endl;
        }
        mout.flush();
        mout.close();
        return 0;
    }
→ Ссылка