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

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

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

Author24 — интернет-сервис помощи студентам
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2019, 16:17
Ответы с готовыми решениями:

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

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

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

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

20
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
04.06.2019, 19:07 12
Цитата Сообщение от llatibro Посмотреть сообщение
да нет же)
и в чем проблема подставить введенную пользователем строку, вместо той что я написал?
0
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 142
04.06.2019, 19:28  [ТС] 13
Цитата Сообщение от zayats80888 Посмотреть сообщение
в чем проблема
В том, что надо вводить эту строку в консоли, когда пользователя просят это сделать, а не в самом коде.
0
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
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
 Аватар для zayats80888
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
04.06.2019, 20:27 20
Цитата Сообщение от llatibro Посмотреть сообщение
так?
я ж сказал, заполняем ДО того как читаем
что из слов
Цитата Сообщение от zayats80888 Посмотреть сообщение
в самом начале main()
не понятно?
1
04.06.2019, 20:27
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2019, 20:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru