0 / 0 / 0
Регистрация: 20.04.2019
Сообщений: 15
1

Считывание текста из файла, для выявления повторяющихся слов с последующей их записью в новый файл

21.04.2019, 01:02. Показов 900. Ответов 3

Студворк — интернет-сервис помощи студентам
Привет. Нужна помощь.
Пишу программку которая выявляет повторяющиеся слова из двух текстовых файлов. Затем выявленные слова записываются в новый файл, слова в котором уже не должны повторяться. Это получилось.

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

Вот код программы:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <set>
#include <iterator>
using namespace std;
 
string text; //Сюда скидывается текст из файла. Затем отсюда будет направляться в массив
vector<string>arr1; //Массив который хранит слова из текста (первого файла)
vector<string>arr2; //Массив который хранит слова из текста (второго файла)
 
//const char razdelit[10] = { ' ', ',', '*', '#', '!', '/', '|', '-', '?', '.' }; ////Массив разделителей
 
struct MyStruct //Всё запаковал в структуру
{
    string File = ""; //Эта переменная хранит названия файла который нужно считать, она инициализируется в мэйне
    int a; //Нужна для if-ов :)
 
    void read() //Функция считывания из файла и копирования в массив
    {
        ifstream file;
        file.open(File);
        if (file.is_open())
        {
            while (!file.eof())
            {
                getline(file, text);
                stringstream ss(text); //Поток ввода-вывода
                if (a == 1)
                {
                    while (ss >> text)
                    {
                        arr1.push_back(text); //кидаем в массив текст
                    }
                }
                if (a == 2)
                {
                    while (ss >> text)
                    {
                        arr2.push_back(text); //кидаем в массив текст
                    }
                }
                ss.str(string()); //Очищаю (а нужно ли так вообще?)
            }
        }
        file.close();       
    }
 
    void out() //Функция просто выводит содержимое двух массивов на экран, просто для того что бы убедиться что это работает
    {                                              //Это просто для наглядности
        cout << "Содержимое массива 1: " << endl;
        for (int i = 0; i < arr1.size(); i++)
        {
            cout << arr1[i] << endl;
        }
        cout << "\n" << "Содержимое массива 2: " << endl;
        for (int i = 0; i < arr2.size(); i++)
        {
            cout << arr2[i] << endl;
        }
    }
 
    void fin() //Функция сравнения двух массивов, и записи результата в новый файл
    {
        set<string>Set; //Что бы слова не повторялись буду скидывать их в set
 
        //------Два цикла сравнения двух массивов на наличие одинаковых слов-------
 
        for (int i = 0; i < arr1.size(); i++) //Первый
        {
            for (int j = 0; j < arr2.size(); j++)
            {
                if (arr1[i] == arr2[j])  //Если слово совпало
                {
                    Set.insert(arr1[i]); //Заносит в set
                }
            }
        }
        for (int i = 0; i < arr2.size(); i++) //Второй
        {
            for (int j = 0; j < arr1.size(); j++)
            {
                if (arr2[i] == arr1[j])
                {
                    Set.insert(arr2[i]);
                }
            }
        }
 
        ofstream fout;
        fout.open("Result.txt"); //Файл с результатом
 
        if (fout.is_open())
        {
            for (set <string> ::iterator it = Set.begin(); it != Set.end(); ++it) //Что бы получить доступ к содержимому set, создаю итератор! 
            {
                fout << *it << ' '; // В цикле, через итератор копирую содержимое в новый файл, добавляю пробел для читаемости
            }
        }
        fout.close();
    }
};
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    MyStruct A;
    A.File = "1.txt"; //Здесь инициализируется переменная File
    A.a = 1;
    A.read();
 
    MyStruct B;
    B.File = "2.txt"; //И здесь
    B.a = 2;
    B.read();
    
    MyStruct D;
    D.out();
 
    MyStruct C;
    C.fin();
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2019, 01:02
Ответы с готовыми решениями:

Считать из файла с последующей записью в другой файл
не хочется слишком активно злоупотреблять вниманием и добротой обитателей форума, но никак не...

Написать программу для считывания заданного текста и выявления предложений с заданным кол-вом слов
Задание звучит: &quot;Написать программу, которая считывает текст из файла и выводит на экран только...

Считывание текста из файла и определение в нем слов
Написать программу, которая считывает текст из файла и определяет сколько в нем слов состоящих не...

Считывание текста из файла и поиск в нем слов
Считывание текста с файла и поиск слов из него. У меня получилось сделать считывание, и поиск по...

3
5884 / 3288 / 1351
Регистрация: 07.02.2019
Сообщений: 8,309
21.04.2019, 01:53 2
Не_придумал_ник,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <set>
#include <iterator>
 
int main()
{
    std::ifstream f1{ "data1.txt" };
    std::ifstream f2{ "data2.txt" };
    if (!f1 || !f2) return -1;
 
    std::string text{ std::istreambuf_iterator<char>{f1}, {} };
    text += { std::istreambuf_iterator<char>{f2}, {} };
 
    std::regex delims{ "[^\\s,*#!/|\\-?.]+" };
    std::set<std::string> words{ std::sregex_token_iterator{text.begin(), text.end(), delims}, {} };
 
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>{std::cout, "\n"});
}
1
0 / 0 / 0
Регистрация: 20.04.2019
Сообщений: 15
21.04.2019, 19:02  [ТС] 3
zayats80888, Спасибо!

Можно получить какое-нибудь разъяснение по этому коду?
0
5884 / 3288 / 1351
Регистрация: 07.02.2019
Сообщений: 8,309
21.04.2019, 20:18 4
Цитата Сообщение от Не_придумал_ник Посмотреть сообщение
Можно получить какое-нибудь разъяснение по этому коду?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <set>
#include <iterator>
 
int main()
{
    std::ifstream f1{ "data1.txt" };// первый файл
    std::ifstream f2{ "data2.txt" };//второй файл
    if (!f1 || !f2) return -1;      //для простоты, если какой либо не открылся, выходим из программы
 
    std::string text{ std::istreambuf_iterator<char>{f1}, {} }; //инициализируем строку содержимым первого файла
    text += { std::istreambuf_iterator<char>{f2}, {} };         //добавляем содержимое второго файла
 
    std::regex delims{ "[^\\s,*#!/|\\-?.]+" };                  //регулярное выражение со списком разделителей, ищем все что между ними(см. справку std::regex)
    std::set<std::string> words{ std::sregex_token_iterator{text.begin(), text.end(), delims}, {} };//инициализируем словарь std::set диапазоном значений итератора доступа к частичным совпадениям(см. справку std::regex)
 
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>{std::cout, "\n"});//копируем словарь в поток std::cout
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2019, 20:18
Помогаю со студенческими работами здесь

Визуализировать DataTable и возможность добавления строки с последующей ее записью в файл
Здравствуйте! Возникла, казалось бы простая задача. Нужно считывать данные их csv файла в...

Получение массива нескольких выбранных чекбоксов с последующей записью в файл
Здравствуйте! Знакомлюсь с PHP, поэтому буду рад любым советам ) В форме есть несколько чекбоксов:...

Загрузка страницы и вывод потока на экран с последующей записью в файл
Задача: Загрузить и вывести на экран первые 14 символов html документа 5 раз подряд и записать...

Считывание матрицы из файла и запись в новый файл
Привет всем! У меня такое задание нужно считать две матрицы А и B из файла, суммировать их и...

Создать список из повторяющихся слов текста из файла. Первый элемент-наиб.часто повторяющееся слово
В файле содержится последовательность слов(вводят с клавиатуры, я так поняла). Нужно создать список...

Запись всех повторяющихся слов в новый массив слов
компилируется без ошибок, запускаю консоль после 13 строчки, а именно ввода количества слов,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru