Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
1

Открытие и чтение файла, запись в файл, помещение результата в файл

04.06.2019, 16:17. Показов 2943. Ответов 20

Eсть алгоритм решения задачи. Не знаю только каким способом открыть файлы и как в них что-либо записывать (для файлов f1 и f2) и помещать результат (для файла g). Обычными методами не получается. Либо я что-то делаю не так. Вот сама задача:

Даны два символьных файла f1 и f2. В f1 - произвольный текст, слова в котором разделены пробелами и знаками препинания. В f2 - не более 40 слов, которые разделены запятыми. Эти слова образуют пару: первое слово считается заменяемым, а второе – заменяющим. Нужно найти в f1 все заменяемые слова и заменить их на заменяющие. Результат поместить в файл g.

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

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
#include <map>
 
using namespace System;
using namespace std;
 
int main()
{
    setlocale(0, "");
    typedef map<string, string> DictArr; //Для удобства 
    //Получение слов из файла F2
    DictArr slovar;
    while (!f2->eof())
    {
        string src_word;
        string sub_word;
        getline(*f2, src_word, ',');//Получаем заменяемое слово
        getline(*f2, sub_word, ',');//Получаем заменитель
        slovar[src_word] = sub_word;//Вносим заменяемое слово(ключ) и заменитель(значение) в ассоциативный массив(словарь)
    }
    //Разбор строки
    string dannyefposleobr;//Содержание файла после обработки
    string tekslovo;//Текущее слово
    //Считываем файл с текстом
    cout << "Parsing data from file F1 ";
    while (!f1->eof())
    {
        char raz;//Разделитель
        f1->get(raz);//Считываем символ
        //Проверяем "А знак ли это препинания?"
        if (raz == ' ' || raz == ',' || raz == '.' || raz == ':' || raz == '!' || raz == '?' || raz == '!' || raz == ';' || raz == '-')
        {
            DictArr::iterator iter = slovar.find(tekslovo);/*Если мы получили знак препинания, 
            то слово считано и можно начать его поиск в словаре*/
            if (iter == slovar.end())//Если слово не нашли, то копируем как есть и прибавляем разделитель
            {
                dannyefposleobr += tekslovo + raz;
            }
            else
            {
                dannyefposleobr += slovar[tekslovo] + raz;/*Если нашли, 
                тогда заменим слово ее значением из словаря и прибавим разделитель*/
            }
            tekslovo.clear();//Слово внесено в dannyefposleobr, следовательно на данный момент слов в буффере нет - чистим переменную
        }
        //Если считанный символ не разделитель, значит это часть слова - помещаем символ в tekslovo
        else
        {
            tekslovo += raz;
        }
    }
    cout << "Done\n";
    return dannyefposleobr;
}
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2019, 16:17
Ответы с готовыми решениями:

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

Создание/открытие файлов, чтение из файла и запись в файл через наследование
Имеется следующая иерархия классов: Файл, Типизированный файл, Текстовый файл Методы:...

Чтение из файла и запись в файл
всем привет! нужно написать программу, которая читает строку из файла. если слово содержит &quot;*&quot;, то...

Запись в файл и чтение из файла
Всем привет. Кто может подсказать решение? Есть полученный заполненный массив. int A. Числа в нём...

20
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 16:38 2
llatibro, уже была тема
Файл f1 - текст, f2 - слова, разделенные запятыми, образующие пару: 1 и 2. Найти в f1 слова 1 и заменить их на 2
1
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 16:53  [ТС] 3
zayats80888, Да, но регулярки мне совсем не понятный метод решения. Поэтому хотелось бы через обычные строки сделать, алгоритм прикрепил

Добавлено через 7 минут
zayats80888, Если сможете написать полностью с открытием и записью в файл, то тогда я смогу что-то понять и разобраться. А по куску кода, по своей неопытности, не могу освоить такую тему как "Регулярные выражения"
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 17:19 4
Лучший ответ Сообщение было отмечено llatibro как решение

Решение

Цитата Сообщение от llatibro Посмотреть сообщение
Если сможете написать полностью с открытием и записью в файл,
Там все это есть, нужно просто раскомментить строки, и закомментить те что с комментариями //test
Вот то же самое без регулярок, правда без игнорирования регистра символов:
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
#include <iostream>
#include <fstream>
#include <map>
#include <string>
 
int main()
{
    //std::ifstream f2{ "f2.txt" };
    //std::string sdict{ std::istreambuf_iterator<char>{f2}, {} };
    std::string sdict{ "aaa,bbb,ccc,ddd,eee,fff" }; // test string
    std::map<std::string, std::string> dict;
    for (std::string::size_type first{}, mid{}, last{};;)
    {
        mid = sdict.find(',', first);
        last = sdict.find(',', mid + 1);
        dict.emplace(sdict.substr(first, mid - first), sdict.substr(mid + 1, last - mid - 1));
        if (last == std::string::npos) break;
        first = last + 1;
    }
 
    //std::ifstream f1{ "f1.txt" };
    //std::string text{ std::istreambuf_iterator<char>{f1}, {} };
    std::string text{ "aaa, bbb. ccc, ddd! eee, fff?" }; // test string
    for (std::string::size_type first{}, last{}; last != std::string::npos;)
    {
        first = text.find_first_not_of(" ,.:;!?\n", first);
        last = text.find_first_of(" ,.:;!?\n", first);
        if (first == std::string::npos) break;
        auto word = dict.find(text.substr(first, last - first));
        if (word != dict.end()) text.replace(first, last - first, word->second);
        first = last + 1;
    }
 
    //std::ofstream g{ "g.txt" };
    //g << text;
    std::cout << text; // test output
}
1
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 18:02  [ТС] 5
zayats80888, раскоментил, закоментил и мне просто нужно вписать это
C++
1
2
3
4
5
6
7
8
9
10
11
12
f2.open("f2.txt", fstream::out);
    if (!f2.is_open())
    {
        cout << "Не открыт" << endl;
    }
    else
    {
        string msg;
        cout << "Задайте файл " << endl;
        getline(cin, msg);
        f2 << msg << "\n";
    }
между этим
C++
1
ifstream f2{ "f2.txt" };
и этим
C++
1
string sdict{ istreambuf_iterator<char>{f2}, {} };
?

Добавлено через 8 минут
zayats80888, Подправьте меня, где я не прав, пожалуйста. Если делаю подобным образом то выдает ошибки
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 18:08 6
Цитата Сообщение от llatibro Посмотреть сообщение
между этим
Цитата Сообщение от llatibro Посмотреть сообщение
и этим
можно ничего не вписывать
Если имя файла нужно ручками ввести то так:
C++
1
2
3
4
5
6
7
8
    std::ifstream f2;
    for (std::string fname; std::getline(std::cin, fname);)
    {
        f2.clear();
        f2.open(fname);
        if (f2) break;
    }
    if (!f2) return -1;
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 18:10  [ТС] 7
zayats80888, Я сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
        ifstream f2{ "f2.txt" };
    string sdict{ istreambuf_iterator<char>{f2}, {} };
    if (!f2)
    {
        cout << "Не открыт" << endl;
    }
    else
    {
        cout << "Задайте файл f2 " << endl;
        getline(cin, sdict);
    }
C++
1
2
3
4
5
6
7
8
9
10
11
    ifstream f1{ "f1.txt" };
    string text{ istreambuf_iterator<char>{f1}, {} };
    if (!f1)
    {
        cout << "Не открыт" << endl;
    }
    else
    {
        cout << "Задайте файл f1 " << endl;
        getline(cin, sdict);
    }
Все запускается, запрашивает ввод, но в конечном счёте ничего не выводит и все файлы пустые
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 18:12 8
Цитата Сообщение от llatibro Посмотреть сообщение
но в конечном счёте ничего не выводит и все файлы пустые
А изначально их кто заполнять будет, дядя Вася?
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 18:14  [ТС] 9
zayats80888, Нужно не имя вводить, а содержимое этих файлов. То есть как у вас в тестовых примерах aaa, bbb. ccc. ddd! и так далее, вот это надо самому вводить с клавиатуры

Добавлено через 44 секунды
Цитата Сообщение от zayats80888 Посмотреть сообщение
А изначально их кто заполнять будет
В том то и дело что надо их заполнять в процессе работы программы
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 18:26 10
Цитата Сообщение от llatibro Посмотреть сообщение
В том то и дело что надо их заполнять в процессе работы программы
Тогда в начале просто добавь
C++
1
2
3
4
5
6
7
    {
        std::ofstream f1{ "f1.txt" };
        f1 << "aaa, bbb. ccc, ddd! eee, fff?";
 
        std::ofstream f2{ "f2.txt" };
        f2 << "aaa,bbb,ccc,ddd,eee,fff";
    }
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 19:03  [ТС] 11
zayats80888, да нет же) Я имею ввиду, что выводится строка "Введите содержимое файла f1: ", юзер вводит всё что душе угодно. Затем выводится строка "Введите содержимое файла f2: ", юзер вводит всё что душе угодно. И далее уже идет работа с тем содержимым, которое ввел юзер)
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 19:07 12
Цитата Сообщение от llatibro Посмотреть сообщение
да нет же)
и в чем проблема подставить введенную пользователем строку, вместо той что я написал?
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 19:28  [ТС] 13
Цитата Сообщение от zayats80888 Посмотреть сообщение
в чем проблема
В том, что надо вводить эту строку в консоли, когда пользователя просят это сделать, а не в самом коде.
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 19:33 14
Цитата Сообщение от llatibro Посмотреть сообщение
В том, что надо вводить эту строку в консоли, когда пользователя просят это сделать.
Вот уж действительно проблема...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    {
        std::string text;
 
        std::ofstream f1{ "f1.txt" };
        std::cout << "f1: ";
        std::getline(std::cin, text);
        f1 << text;
 
        std::ofstream f2{ "f2.txt" };
        std::cout << "f2: ";
        std::getline(std::cin, text);
        f2 << text;
    }
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 19:39  [ТС] 15
zayats80888, Даже если написать так, то произойдет конфликт между ofstream и ifstream. Различные базовые типы. Если убрать ofstream, будет ругаться на <<, если убрать ifstream, будет ругаться на
C++
1
for (std::string::size_type first{}, mid{}, last{};;)
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 19:40 16
Цитата Сообщение от llatibro Посмотреть сообщение
Даже если написать так, то произойдет конфликт между ofstream и ifstream.
Ты же видишь фигурные скобки вокруг кода из последнего поста?
1
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 20:13  [ТС] 17
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вот уж действительно проблема...
Да, я абсолютно также делал. Но ругается на << и на различные базовые типы

Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты же видишь фигурные скобки вокруг кода из последнего поста?
Упс, да, прошу прощения.

Добавлено через 24 минуты
zayats80888, zayats80888, хах, забавная вещь происходит. Я задаю первый и второй файлы, но файл g изменяется (изменяется правильно кстати) только на следующий раз, то есть когда я опять запускаю программу и задаю первый и второй файлы)

Добавлено через 3 минуты
zayats80888, Мне кажется я как-то неверно закрываю файлы. (Я просто их закрыл после вывода в файл g)
C++
1
2
3
4
5
    ofstream g{ "g.txt" };
    g << text;
    f1.close();
    f2.close();
    g.close();
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 20:14 18
Цитата Сообщение от llatibro Посмотреть сообщение
забавная вещь происходит
кусок кода, отвечающий за заполнение, должен находится в самом начале main()

Добавлено через 51 секунду
Цитата Сообщение от llatibro Посмотреть сообщение
Мне кажется я как-то неверно закрываю файлы.
не нужно ничего закрывать, все закроется само
1
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 20:26  [ТС] 19
zayats80888, так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    setlocale(0, "");
    ifstream f1{ "f1.txt" };
    string text{ istreambuf_iterator<char>{f1}, {} };
    {
        ofstream f1{ "f1.txt" };
        string text;
        cout << "f1: ";
        getline(cin, text);
        f1 << text;
    }
    ifstream f2{ "f2.txt" };
    string sdict{ istreambuf_iterator<char>{f2}, {} };
    {
        ofstream f2{ "f2.txt" };
        string text;
        cout << "f2: ";
        getline(cin, text);
        f2 << text;
    }
Проблема остаётся той же
0
4335 / 2393 / 995
Регистрация: 07.02.2019
Сообщений: 6,283
04.06.2019, 20:27 20
Цитата Сообщение от llatibro Посмотреть сообщение
так?
я ж сказал, заполняем ДО того как читаем
что из слов
Цитата Сообщение от zayats80888 Посмотреть сообщение
в самом начале main()
не понятно?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2019, 20:27

Чтение из файла и запись в файл
Доброго времени суток. Идея в чем: Пример входных данных из файла: 5 o 3 c 4 o 5 c 6 o 7

Чтение из файла, запись в файл
Тут такая у меня проблема. 1) Не работает цикл в майне. Как его правильно организовать? 2) И,...

Запись в файл, чтение из файла
В общем, неделю назад мне помогли на этом форуме сделать программу. И все прекрасно работает на...

Чтение из файла и запись в файл
Создайте текстовый файл целых чисел (значения вводятся с клавиатуры). Проанализировав в программе...


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

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

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