С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Yuranga
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22

Разбор длинных текстовых файлов на составляющие

20.08.2019, 22:37. Показов 1472. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть проблемы: существует текстовый файл, состоящий из неопределённого количества символов. Программа по очереди считывает каждый символ, и в зависимости от того, какой символ она считала, выполняются те или иные действия. Для примера, если символ "a", то переменная x увеличивается на 1, а если символ "b", то уменьшается на 1. Как такое можно реализовать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.08.2019, 22:37
Ответы с готовыми решениями:

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

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

Разбор текстовых файлов. Архитектура
надо разобрать текстовый файл с структурированными разношерстными данными (с вложенносятми и т.д.) Сделал модели под каждый возможный тип...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,887
Записей в блоге: 12
21.08.2019, 14:43
На каком языке нужна программа?
1
 Аватар для Yuranga
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 15:50  [ТС]
Язык программирования C++. Вопрос главным образом в том, какие для этого можно использовать функции.
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
21.08.2019, 18:11
Лучший ответ Сообщение было отмечено Yuranga как решение

Решение

Вот так, например. Только учтите, функция get() возвращает любой символ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
 
using namespace std;
 
//hold console window
int progEnd(int code = 0) { std::cout << "\nEND\n"; system("pause>nul"); return code; }
 
int main() {
    ifstream fin("input.txt");
    
    int value = 0;
    while(fin) {
        switch(fin.get()) {
            case 'a': value++; break;
            case 'b': value--; break;
            default: cout << "Unknown symbol\n";
        }
    }
    cout << "Value now equal to " << value;
    
    return progEnd();
}
2
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
21.08.2019, 18:34
Не совсем по теме, но очень похоже. Есть у меня пара файлов - резервные копии закладок из Мозиллы Фаерфокса (в формате .JSON). Делал я их пару лет назад, но захотелось вспомнить, что за закладки у меня там. Для этих целей написал небольшую прогу:

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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    ifstream f("bookmarks-2019-02-15.json");  // считываение из файла
 
    string path = "myFileJSON.txt";
    
 
    ofstream fout;
    fout.open(path, ofstream::app);
 
    char v;
    string val; 
    vector<string> vec;
    
    while (true)
    {       
        if (f.eof())
            break;
 
        f >> v;
 
        if(v != '"')
        {
            val.push_back(v);                       
        }
        if(v == '"')
        {
            vec.push_back(val);         
            val.clear();
        }               
    }
 
    vector<string> vectorStr;
    vector< vector<string> > vectorVectorStr;
 
    
    string temp;
    for(int i = 0; i < vec.size(); i++)
    {       
        if(vec[i].substr(0, 5) == "https")
        {
            vectorStr.push_back(vec[i]);            
        }
        
    }
 
    for (int i = 0; i < vectorStr.size(); i++)
    {
        fout.open(path, ofstream::app);
 
        if (!fout.is_open())
        {
            cout << "ошибка открытия файла!" << endl;
        }
        else
        {
            cout << "файл открыт!" << endl;       
 
            fout << vectorStr.at(i) << endl << endl;
            
        }
        fout.close();
    }       
    
    f.close();  
 
    return 0;
}
Прекрасно может работать и с текстовыми файлами. Считывание происходит посимвольное в
C++
1
 f >> v;
Да - забыл добавить - результат считывания сохраняется в другой текстовый файл (myFileJSON.txt)
0
 Аватар для Yuranga
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 20:10  [ТС]
Цитата Сообщение от Cortas Посмотреть сообщение
Вот так, например. Только учтите, функция get() возвращает любой символ.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
 
using namespace std;
 
//hold console window
int progEnd(int code = 0) { std::cout << "\nEND\n"; system("pause>nul"); return code; }
 
int main() {
    ifstream fin("input.txt");
    
    int value = 0;
    while(fin) {
        switch(fin.get()) {
            case 'a': value++; break;
            case 'b': value--; break;
            default: cout << "Unknown symbol\n";
        }
    }
    cout << "Value now equal to " << value;
    
    return progEnd();
}
Спасибо, но есть одна небольшая проблема: программа всегда выдаёт Unknown symbol в конце разбора текста. Почему это происходит и как это можно исправить?
0
 Аватар для Recrut_rf
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
21.08.2019, 20:24
Цитата Сообщение от Yuranga Посмотреть сообщение
программа всегда выдаёт Unknown symbol в конце разбора текста. Почему это происходит и как это можно исправить?
Это происходит потому что
Цитата Сообщение от Cortas Посмотреть сообщение
функция get() возвращает любой символ.
и этот "любой символ" в
C++
1
2
3
4
5
switch(fin.get()) {
            case 'a': value++; break;
            case 'b': value--; break;
            default: cout << "Unknown symbol\n";
        }
попадает в секцию default. В результате в консоль печатается
C++
1
cout << "Unknown symbol\n";
Добавлено через 1 минуту
Цитата Сообщение от Yuranga Посмотреть сообщение
как это можно исправить?
Смотря что вам нужно - самый простой способ - убрать секцию дефолт совсем
0
 Аватар для Yuranga
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 20:43  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Это происходит потому что и этот "любой символ" в
C++
1
2
3
4
5
switch(fin.get()) {
            case 'a': value++; break;
            case 'b': value--; break;
            default: cout << "Unknown symbol\n";
        }
попадает в секцию default. В результате в консоль печатается
C++
1
cout << "Unknown symbol\n";
Добавлено через 1 минуту


Смотря что вам нужно - самый простой способ - убрать секцию дефолт совсем
Программа всегда выдаёт "Unknown symbol", даже если в тексте нет лишних символов. Если же лишние символы есть, то "Unknown symbol" выдаётся несколько раз (например если в тексте 2 лишних символа, то программа выдаёт "Unknown symbol" 3 раза).
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
21.08.2019, 23:03
Цитата Сообщение от Yuranga Посмотреть сообщение
Программа всегда выдаёт "Unknown symbol", даже если в тексте нет лишних символов.
Вероятно это происходит из-за того, что последним символ является символ конца файла из-за чего консоль выводит сообщение.

"починить" так:
C++
1
if(!fin) break;
0
 Аватар для Yuranga
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
22.08.2019, 11:51  [ТС]
Цитата Сообщение от Cortas Посмотреть сообщение
Вероятно это происходит из-за того, что последним символ является символ конца файла из-за чего консоль выводит сообщение.

"починить" так:
C++
1
if(!fin) break;
Где именно в коде нужно добавить это добавить?
0
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
22.08.2019, 12:26
Цитата Сообщение от Yuranga Посмотреть сообщение
Где именно в коде нужно добавить это?
Для этого в любом случае потребуется переменная, так что лучше сделать так:
C++
1
2
3
4
5
6
7
8
char buf;
while(fin.get(buf)) {
    switch(buf) {
        case 'a': value++; break;
        case 'b': value--; break;
        default: cout << "Unknown symbol\n";
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2019, 12:26
Помогаю со студенческими работами здесь

Обработка текстовых файлов. Вывести первую из самых коротких строк файла и последнюю из самых длинных
Дан текстовый файл f. Составить программу для вывода первой из самых коротких строк файла и последней из самых длинных. То есть...

Разбор строки на составляющие не получается.
Тут такая проблема надо определить версию ОС и браузера пользователя зашедшего на сайт. Вот постейший код который я смог найти: var...

Разбор регулярного вырожения не составляющие
Добрый день! Есть задача, разобирать регулярное вырожение на составляющие, т.е. узнать, соответствуе ли регулярное вырожение только буквам,...

Перловский regexp перелопатить в джавовский вариант (разбор URI на составляющие)
написал я значит парсер + http-сканнер на языке perl.. очень всё хорошо получилось.. один только минус - потоки глючат.. нашёл в сети что в...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru