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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Mr.kto
92 / 91 / 1
Регистрация: 18.08.2012
Сообщений: 309
#1

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

08.05.2013, 23:08. Просмотров 2797. Ответов 8
Метки нет (Все метки)

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

AAA
БББ
BBB
111
222

ыыы
ввв
ааа
333
444

и так далее.
Нужно найти ААА и далее (БББ ВВВ 111 222) заменить на что та другое.
Желательно с помощью библиотеки fstream.
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 01:06     Поиск и замена слов в файле txt #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;
}
Mr.kto
92 / 91 / 1
Регистрация: 18.08.2012
Сообщений: 309
09.05.2013, 14:01  [ТС]     Поиск и замена слов в файле txt #3
Спасибо большое, но неужели не можно как-то это все организовать попроще? Я в С++ только азы знаю а тут
А да еще, скажите как в вашем примере передать путь к файлу, допустим A.txt который лежит в корне программы?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 21:01     Поиск и замена слов в файле txt #4
Mr.kto, если txt файл лежит в одном каталоге с исполняемым модулем, тогда при запуске программы из командной строки, просто после ввода названия программы 2-м аргументом нужно ввести имя текстового файла. П. С. чем больше всяких контейнеров, итераторов и прочих средств С++, тем меньше нужно возиться с низкоуровневым кодом. Структура программы будет более простой: кода будет меньше, а читаемость будет лучше.

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

Добавлено через 2 минуты
П.С.С можно написать код на чистом С и С++ и сравнить: количество символов в исходном файле на С будет в 1.5 -2 раза больше, а чтобы понять код нужно будет в 2-3 раза больше времени чем при варианте с С++.
А можно ваш код сделать как функцию? Так как это только часть программы которую я не смог сам сделать
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.05.2013, 22:35     Поиск и замена слов в файле txt #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;
}
Mr.kto
92 / 91 / 1
Регистрация: 18.08.2012
Сообщений: 309
09.05.2013, 23:29  [ТС]     Поиск и замена слов в файле txt #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;
}
Вы так грамотно пишите код А можно мне попроще то есть процедура в нее передали адрес к файлу (как строку с кода) и все? Спасибо!
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
10.05.2013, 01:20     Поиск и замена слов в файле txt #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 01:30     Поиск и замена слов в файле txt
Еще ссылки по теме:

Замена слов в файле звездочками C++
Замена нужных слов в файле C++
C++ Поиск и замена/удаление в текстовом файле
C++ Поиск в .txt файле и вывод на экран
Замена слов в текстовом файле C++

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

Или воспользуйтесь поиском по форуму:
Mr.kto
92 / 91 / 1
Регистрация: 18.08.2012
Сообщений: 309
10.05.2013, 01:30  [ТС]     Поиск и замена слов в файле txt #9
Большущие спасибо
Yandex
Объявления
10.05.2013, 01:30     Поиск и замена слов в файле txt
Ответ Создать тему
Опции темы

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