Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
104 / 105 / 18
Регистрация: 18.08.2012
Сообщений: 308
1

Поиск и замена слов в файле txt

08.05.2013, 23:08. Показов 10386. Ответов 9
Метки нет (Все метки)

Как заменить и найти слова в файле txt на С++.
То есть есть файл вот такой структуры

AAA
БББ
BBB
111
222

ыыы
ввв
ааа
333
444

и так далее.
Нужно найти ААА и далее (БББ ВВВ 111 222) заменить на что та другое.
Желательно с помощью библиотеки fstream.
Спасибо!
1

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2013, 23:08
Ответы с готовыми решениями:

Поиск и замена слова в .txt файле
Здравствуйте, столкнулся с такой задачей- необходимо в файлах .txt в строках, где первое поле =...

Поиск слов в файле (txt)
здравствуйте, наткнулся на проблему. Короче, делаю программу, чтоб делать морфологический разбор...

Поиск и замена части строки в файле txt
Добрый день товарищи! Знаю тема неоднократно создавалась,но пошуршав на сайте ничего такого как...

Поиск и замена слов в файле
В общем есть файл1, в нем записаны слова через пробел в 1 строку, нужно чтоб из этого файла бралось...

9
интересующийся
309 / 280 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 01:06 2
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
61
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
 
#define FLUSH_CIN if (std::wcin.peek()) std::wcin.ignore()
 
int main(int argc, const char* argv[])
{
    if (argc != 2)
    {
        std::cerr << "wrong arguments" << std::endl;
        return 1;
    }
 
    std::locale::global(std::locale(""));
    
    std::wstring in_word, out_word;
    std::wcout << L"Найти слово: ";
    std::wcin >> in_word;
    FLUSH_CIN;
    std::wcout << L"Заменить на слово: ";
    std::getline(std::wcin, out_word);
 
    std::wifstream in(argv[1], std::ios::in);
    if (!in.good())
    {
        std::cerr << "couldn't open file '" << argv[1] << "'\n";
        return 1;
    }
 
    std::istream_iterator<std::wstring, wchar_t> ii(in);
    std::istream_iterator<std::wstring, wchar_t> eos;
    std::vector<std::wstring> fileInside(ii, eos);
    in.close();
 
    for (int i = 0; i < fileInside.size(); ++i)
    {
        if (fileInside[i] == in_word)
        {
            fileInside[i] = out_word;
        }
    }
 
    std::wofstream out(argv[1], std::ios::out | std::ios::trunc);
    if (!out.good())
    {
        std::cerr << "couldn't open file '" << argv[1] << "'\n";
        return 1;
    }
 
    for (int i = 0; i < fileInside.size(); ++i)
    {
        out << fileInside[i] << std::endl;
    }
 
    out.close();
 
    return 0;
}
1
104 / 105 / 18
Регистрация: 18.08.2012
Сообщений: 308
09.05.2013, 14:01  [ТС] 3
Спасибо большое, но неужели не можно как-то это все организовать попроще? Я в С++ только азы знаю а тут
А да еще, скажите как в вашем примере передать путь к файлу, допустим A.txt который лежит в корне программы?
0
интересующийся
309 / 280 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 21:01 4
Mr.kto, если txt файл лежит в одном каталоге с исполняемым модулем, тогда при запуске программы из командной строки, просто после ввода названия программы 2-м аргументом нужно ввести имя текстового файла. П. С. чем больше всяких контейнеров, итераторов и прочих средств С++, тем меньше нужно возиться с низкоуровневым кодом. Структура программы будет более простой: кода будет меньше, а читаемость будет лучше.

Добавлено через 2 минуты
П.С.С можно написать код на чистом С и С++ и сравнить: количество символов в исходном файле на С будет в 1.5 -2 раза больше, а чтобы понять код нужно будет в 2-3 раза больше времени чем при варианте с С++.
1
104 / 105 / 18
Регистрация: 18.08.2012
Сообщений: 308
09.05.2013, 21:09  [ТС] 5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Mr.kto, если txt файл лежит в одном каталоге с исполняемым модулем, тогда при запуске программы из командной строки, просто после ввода названия программы 2-м аргументом нужно ввести имя текстового файла. П. С. чем больше всяких контейнеров, итераторов и прочих средств С++, тем меньше нужно возиться с низкоуровневым кодом. Структура программы будет более простой: кода будет меньше, а читаемость будет лучше.

Добавлено через 2 минуты
П.С.С можно написать код на чистом С и С++ и сравнить: количество символов в исходном файле на С будет в 1.5 -2 раза больше, а чтобы понять код нужно будет в 2-3 раза больше времени чем при варианте с С++.
А можно ваш код сделать как функцию? Так как это только часть программы которую я не смог сам сделать
0
интересующийся
309 / 280 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 22:35 6
Конечно, достаточно весь код помесить в функцию, например так:
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
61
62
63
64
65
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
#define FLUSH_CIN if (std::wcin.peek()) std::wcin.ignore()
typedef std::istream_iterator<std::string> ii;
 
bool cmp(const std::string& left, const std::string& right)
{
    return left.size() < right.size();
}
 
// При ошибке возвращает -1.
int changeFile(int argc, const char* argv[])
{
    std::ifstream in(argv[1], std::ios::in);
    std::ofstream out(argv[2], std::ios::out);
    if (!in || !out)
    {
        std::cerr << "couldn't open file(s) " << std::endl;
        return -1;
    }
 
    std::string line;
    while (std::getline(in, line))
    {
        if (line.size() > 0)
        {
            std::stringstream str(line);
            std::vector<std::string> v((ii(str)), ii());
 
            std::vector<std::string>::const_iterator max_word
                = std::max_element(v.begin(), v.end(), cmp);
 
            std::string new_word = *max_word;
            new_word += ' ';
            new_word += line;
            new_word += ' ';
            new_word += *max_word;
            out << new_word << std::endl;
        }
        else
        {
            out << "\n";
        }
    }
 
    in.close(); out.close();
    return 0;
}
 
 
int main(int argc, const char* argv[])
{
    if (changeFile(argc, argv) != -1)
    {
        // do somthing
        return 0;
    }
    return 1;
}
1
104 / 105 / 18
Регистрация: 18.08.2012
Сообщений: 308
09.05.2013, 23:29  [ТС] 7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Конечно, достаточно весь код помесить в функцию, например так:
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
61
62
63
64
65
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
#define FLUSH_CIN if (std::wcin.peek()) std::wcin.ignore()
typedef std::istream_iterator<std::string> ii;
 
bool cmp(const std::string& left, const std::string& right)
{
    return left.size() < right.size();
}
 
// При ошибке возвращает -1.
int changeFile(int argc, const char* argv[])
{
    std::ifstream in(argv[1], std::ios::in);
    std::ofstream out(argv[2], std::ios::out);
    if (!in || !out)
    {
        std::cerr << "couldn't open file(s) " << std::endl;
        return -1;
    }
 
    std::string line;
    while (std::getline(in, line))
    {
        if (line.size() > 0)
        {
            std::stringstream str(line);
            std::vector<std::string> v((ii(str)), ii());
 
            std::vector<std::string>::const_iterator max_word
                = std::max_element(v.begin(), v.end(), cmp);
 
            std::string new_word = *max_word;
            new_word += ' ';
            new_word += line;
            new_word += ' ';
            new_word += *max_word;
            out << new_word << std::endl;
        }
        else
        {
            out << "\n";
        }
    }
 
    in.close(); out.close();
    return 0;
}
 
 
int main(int argc, const char* argv[])
{
    if (changeFile(argc, argv) != -1)
    {
        // do somthing
        return 0;
    }
    return 1;
}
Вы так грамотно пишите код А можно мне попроще то есть процедура в нее передали адрес к файлу (как строку с кода) и все? Спасибо!
0
интересующийся
309 / 280 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
10.05.2013, 01:20 8
Цитата Сообщение от Mr.kto Посмотреть сообщение
Вы так грамотно пишите код
Вы мне явно льстите - я только учусь.
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
61
62
63
64
65
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
 
#define FLUSH_CIN if (std::wcin.peek()) std::wcin.ignore()
typedef std::istream_iterator<std::string> ii;
 
bool cmp(const std::string& left, const std::string& right)
{
    return left.size() < right.size();
}
 
// При ошибке возвращает -1.
int changeFile(const char* fileIn, const char* fileOut)
{
    std::ifstream in(fileIn, std::ios::in);
    std::ofstream out(fileOut, std::ios::out);
    if (!in || !out)
    {
        std::cerr << "couldn't open file(s) " << std::endl;
        return -1;
    }
 
    std::string line;
    while (std::getline(in, line))
    {
        if (line.size() > 0)
        {
            std::stringstream str(line);
            std::vector<std::string> v((ii(str)), ii());
 
            std::vector<std::string>::const_iterator max_word
                = std::max_element(v.begin(), v.end(), cmp);
 
            std::string new_word = *max_word;
            new_word += ' ';
            new_word += line;
            new_word += ' ';
            new_word += *max_word;
            out << new_word << std::endl;
        }
        else
        {
            out << "\n";
        }
    }
 
    in.close(); out.close();
    return 0;
}
 
 
int main()
{
    if (changeFile("fileInput.txt", "fileOutput.txt") != -1)
    {
        // do somthing
        return 0;
    }
    return 1;
}
2
104 / 105 / 18
Регистрация: 18.08.2012
Сообщений: 308
10.05.2013, 01:30  [ТС] 9
Большущие спасибо
1
257 / 162 / 53
Регистрация: 03.05.2019
Сообщений: 338
19.07.2019, 18:56 10
Можно ещё так:
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
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    string buffer, text, word; // - хранилища текста файла и слово для поиска
    cout << "Искомое слово: "; // - играет роль регистр и язык, так, слова ААА и ааа будут разными запросами
    cin >> word; // - чтение до пробела
 
    ifstream in("file.txt"); // - поток для чтения и записи файла (file.txt в директории с програмой)
    while (in >> buffer) // - чтение с файла пока есть слова (под словом понимается часть текста, разделенная пробелами (' ', '\t', '\n'))
    {
        if (buffer == word) // - если найдено нужное слово
        {
            cout << "Текст после заданого слова: ";
            cin.ignore(); // - пропуск '\n', оставленного в потоке ввода после оператора ">>"
            getline(cin, buffer);
 
            ofstream out("file.txt"); // - открытие потока для чтения (по умолчанию очищает файл)
            out << text << buffer;
        }
        else
        {
            text += buffer;
            text += '\n';
        }
    }
 
    return 0;
}
Метод не идеален и подходит именно для ваших строк. Также используется память посредством string, по-этому для больших файлов может быть не оптимально.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2019, 18:56

Поиск и замена слов в текстовом файле
Здравствуйте, помогите с реализацией задачи. в файле 222.txt (прикрепил) после слова &quot;Name:&quot; до...

Поиск и замена слов в текстовом файле в несколько потоков
Добрый день. Помогите пожалуйста разобраться с потоками. Мне необходимо: Обеспечить поиск и...

Поиск слов в файле и его замена с предварительным бэкапом этих файлов!
Ребята помогите пожалуйста с таким вопросом! Думаю многие когда начинали изучать Perl каким то...

Замена всех слов "паника" на слово "скорость" в txt файле
Всем HI ! У меня возникла задача обработать объемный текст который у меня в электронном виде...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.