Форум программистов, компьютерный форум CyberForum.ru

Программа поиска слова и его замены на с/с++ - C++

Восстановить пароль Регистрация
 
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
07.04.2014, 23:51     Программа поиска слова и его замены на с/с++ #1
Здравствуйте, дорогие форумчане. Мне необходимо реализовать программу для считывания строки из первого файла, считывание заменяемого слова из второго и слова, которое будет вместо него, из третьего.
Измененную строку переписать в первый файл, старое стереть.
Вот есть код, но он не полный, т.к. функция
str.replace(str.find(wfind),wfind.length(),wreplace); работает только один раз
и еще нужно сделать так,чтобы прога делала поиск и замену нескольких пар слов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <locale>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
//wfind - слово, которое ищем и будем заменять
//wreplace - слово, на которое будем заменять
//str - строка текста
int main() 
{
    int i = 0, j = 0;
    setlocale(LC_ALL,"Russian");
 
    std::ifstream file("log.txt");
    std::string str;    
    while(file) 
        std::getline(file, str);
        file.close();
 
    std::ifstream file1("wfind.txt");
    std::string wfind;
    while(file1) 
        std::getline(file1, wfind);
        file1.close();
 
    std::ifstream file2("wreplace.txt");
    std::string wreplace;
    while(file2) 
        std::getline(file2, wreplace);
        file2.close();
 
    cout << "Исходная строка:\n" << "\t" << str << "\n";
    cout << "Слово, которое будем заменять:\n" << "\t" << wfind << "\n";
    cout << "Слово, которое будет вместо данного:\n" << "\t" << wreplace << "\n";
 
    std::size_t found = str.find(wfind);
    if (found!=std::string::npos)
 
    str.replace(str.find(wfind),wfind.length(),wreplace);
 
    cout << "Измененная строка:\n" << "\t" << str << "\n";
    cout << "Количество замен:\n" << "\t" << j << "\n";
 
    std::ofstream file3("file_name.txt");
    file3 << str;
    file3.close();
 
    getchar();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2014, 23:51     Программа поиска слова и его замены на с/с++
Посмотрите здесь:

Нужна программа для поиска слова в тексте. с++ C++
написание программы для поиска и замены части строк в двух текстовых файлах с разным синтаксисом C++
Программа, которая вводит текст, удаляет в нем все слова заданной длины, а оставшиеся слова выводит в алфавитн C++
Нужна программа зашифровки текста(файла) методом прямой замены (на с++) C++
Бинарное дерево поиска.Вывести слова с тремя гласными C++
C++ Программа поиска
C++ Оператор преобразования типа и его эквивалентные замены, поиск строки в текстовом файле , содержащей заданный
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
08.04.2014, 00:12     Программа поиска слова и его замены на с/с++ #2
C++
1
2
3
4
while(str.find(wfind) != str.end())
{
   str.replace(str.find(wfind),wfind.length(),wreplace);
}
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
08.04.2014, 15:46  [ТС]     Программа поиска слова и его замены на с/с++ #3
rcyn, выдает такую ошибку
error C2678: бинарный "!=": не найден оператор, принимающий левый операнд типа "unsigned int" (или приемлемое преобразование отсутствует)
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
08.04.2014, 22:22     Программа поиска слова и его замены на с/с++ #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от EvgeZ Посмотреть сообщение
error C2678: бинарный "!=": не найден оператор, принимающий левый операнд типа "unsigned int" (или приемлемое преобразование отсутствует)

C++
1
2
3
4
while(str.find(wfind) != std::string::npos)
{
   str.replace(str.find(wfind),wfind.length(),wreplace);
}
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
13.04.2014, 19:24  [ТС]     Программа поиска слова и его замены на с/с++ #5
rcyn, спасибо, помогло))

Добавлено через 18 часов 26 минут
только одна закавыка есть
класс <string> ищет только комбинации слов, а не считывает их по отдельности и заменяет
то есть если есть "fox and cat"
и надо заменить "fox cat" на,скажем, "dog horse" по порядку, то ничего не измениться
как это изменить?

Добавлено через 39 минут
ну или так сделать
считал первое
заменил
считал второе
заменил
ну и т.д.
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
14.04.2014, 15:23     Программа поиска слова и его замены на с/с++ #6
класс string просто удобный контейнер для char
он может хранить "строку" или "вот такую строку"
дело в том что вы используете для записи в строку, например если вы используете
C++
1
сin >> str;
и введете "Слава роботам!" то оператор >> запишет в str "Cлава", так как он считывает строку до разделителя (например: пробел, табуляция, новая строка).
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
14.04.2014, 22:22  [ТС]     Программа поиска слова и его замены на с/с++ #7
rcyn, а как прописать считывание после разделителя?
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
14.04.2014, 22:57     Программа поиска слова и его замены на с/с++ #8
EvgeZ,
по считывает до \n:
istream& getline (istream& is, string& str);
C++
1
std::getline(std::cin, str);
считывает до указанного пользователем разделителя (например '\t' или '\n' или 'a')
istream& getline (istream& is, string& str, char delim);
C++
1
std::getline(std::cin, std, '~');
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
14.04.2014, 23:02  [ТС]     Программа поиска слова и его замены на с/с++ #9
rcyn, я поставил считывание до пробела, но в каждом цикле for'а он считывает и заменят то же самое, что и в первой итерации
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <locale>
#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <cstring>
 
using namespace std;
 
//wfind - слово, которое ищем и будем заменять
//wreplace - слово, на которое будем заменять
//str - строка текста
int main() 
{
    int i = 0, j = 0;
 
    setlocale(LC_ALL,"Russian");
 
    std::ifstream file("log.txt");
    std::string str;    
    while(file) 
        std::getline(file, str);
        file.close();
 
    for (int i = 0; i < (int)str.size(); ++i)
    {
        std::ifstream file1("wfind.txt");
        std::string wfind;
        //while (file1)
            std::getline(file1,wfind,' ');
        //file1.close();
    
        std::ifstream file2("wreplace.txt");
        std::string wreplace;
        //while (file2)
            std::getline(file2, wreplace,' ');
            //file2.close();
 
        cout << "Слово, которое будем заменять:\n" << "\t" << wfind << "\n";
        cout << "Слово, которое будет вместо данного:\n" << "\t" << wreplace << "\n";
 
        while(str.find(wfind) != std::string::npos)
        {
            str.replace(str.find(wfind),wfind.length(),wreplace);
            i++;
        }
 
        cout << "Количество замен:\n" << "\t" << i << "\n";
 
        std::ofstream file3("file_name.txt");
        file3 << str;
        file3.close();
 
    }
    
    getchar();
    retur
n 0;
}
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
14.04.2014, 23:49     Программа поиска слова и его замены на с/с++ #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   char c;
   string str;
   while(cin.get(c) && c != EOF) // EOF - метка конца файла, в консоли можно ввести нажав Ctrl+Z (выглядит как ^Z)
      str += c;
 
   string wfind;
   string wreplaсe;
   
   cin.clear(); // восстАнавливаем поток после ввода Ctrl+Z
   cin.sync();
   
   std::getline(cin, wfind);
   std::getline(cin, wreplaсe);
 
   while(str.find(wfind) != std::string::npos)
   {
      str.replace(str.find(wfind), wfind.length(), wreplaсe);
   }
 
   cout << str << endl;
Добавлено через 12 минут
Можно записать все строки из потока ввода так:
C++
1
2
3
4
   string str, s;
 
   while(std::getline(cin, s).good()) 
      str += s + '\n';
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
19.04.2014, 23:50  [ТС]     Программа поиска слова и его замены на с/с++ #11
У меня получилось реализовать программу, она считывает и заменяет несколько слов, если бы не одно НО: она делает это настолько хорошо, что заменяет все вхождения символьных комбинаций
ну например при замене (on) на (AAA) в словосочетании (on the occupation) будет (AAA the occupatiAAA)
Такие дела. Если кому все еще интересно, я буду только рад помощи
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <locale>
#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <cstring>
 
using namespace std;
 
//wfind - слово, которое ищем и будем заменять
//wreplace - слово, на которое будем заменять
//str - строка текста
 
int main() 
{
    int j = 0;
 
    setlocale(LC_ALL,"Russian");
 
    ifstream file("log.txt");
    string str, temp; 
 
    getline(file, str);
    while (!file.eof())
    {
        getline(file, temp);
        str.push_back('\n');
        str.append(temp);
    }
 
    ifstream file1("wfind.txt");
    string wfind;
 
    ifstream file2("wreplace.txt");
    string wreplace;
    for(int i=0;i<100;i++)
    {
        if(getline(file1,wfind,' ')!=NULL && getline(file2,wreplace,' ')!=NULL)
        {
            while(str.find(wfind) != std::string::npos)
            {
                str.replace(str.find(wfind),wfind.length(),wreplace);
                j++;
            }
        }
    }
 
    ofstream file3("log.txt");
    file3 << str;
    file3.close();
 
    file.close();
    file1.close();
    file2.close();
 
    cout << "Количество замен:\n" << "\t" << j << "\n";
 
    getchar();
    return 0;
}
Думал через isalpha(), но не знаю, как реализовать считывание только слов, по левую и правую сторону которых стоят только не буквы (пробели, запятые, тире, точки и т.д.)

Добавлено через 2 часа 49 минут
Вот что я накумекал. Но все равно не работает, ибо не правильно прописаны условия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int i = 0;i < 100;i++)
{
    if(getline(file1,wfind,' ')!=NULL && getline(file2,wreplace,' ')!=NULL )
    {
        while(str.find(wfind) != string::npos)
        {
            if(isalpha(str[i])==0 && isalpha(str[i])!=0)
                break;
            else
                str.replace(str.find(wfind),wfind.length(),wreplace);
                j++;
        }
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 00:00     Программа поиска слова и его замены на с/с++
Еще ссылки по теме:

C++ Программа для поиска введенного слова или фразы во всех файлах каталога
Где должен находиться файл, чтоб программа его открыла, или как указывать его имя? C++
C++ Переписать с использованием шаблонов программу поиска заданного слова в файле
Функция замены слова в строке и символ '/' C++
C++ Алгоритм поиска пути и прорисовка его

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
20.04.2014, 00:00     Программа поиска слова и его замены на с/с++ #12
EvgeZ, Если нужно работать только с словами, то вот тебе пример программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include<sstream>
#include <string>
int main()
{
    std::string str = "on the occupation",new_str;
    std::string str_replace = "AAA";
    std::stringstream s(str);
    for(std::string word;s>>word;){
        if (word == "on")
            word = str_replace;
        new_str+=(word+" ");
    }
    std::cout<<new_str;
    return 0;
}
Yandex
Объявления
20.04.2014, 00:00     Программа поиска слова и его замены на с/с++
Ответ Создать тему
Опции темы

Текущее время: 03:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru