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

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

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

Суть проблемы: существует текстовый файл, состоящий из неопределённого количества символов. Программа по очереди считывает каждый символ, и в зависимости от того, какой символ она считала, выполняются те или иные действия. Для примера, если символ "a", то переменная x увеличивается на 1, а если символ "b", то уменьшается на 1. Как такое можно реализовать?
0

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

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

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

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

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

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

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31189 / 20387 / 7940
Регистрация: 22.10.2011
Сообщений: 35,356
Записей в блоге: 6
21.08.2019, 14:43 2
На каком языке нужна программа?
1
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 15:50  [ТС] 3
Язык программирования C++. Вопрос главным образом в том, какие для этого можно использовать функции.
0
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
21.08.2019, 18:11 4
Лучший ответ Сообщение было отмечено 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
297 / 244 / 53
Регистрация: 14.10.2014
Сообщений: 1,105
21.08.2019, 18:34 5
Не совсем по теме, но очень похоже. Есть у меня пара файлов - резервные копии закладок из Мозиллы Фаерфокса (в формате .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
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 20:10  [ТС] 6
Цитата Сообщение от 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
297 / 244 / 53
Регистрация: 14.10.2014
Сообщений: 1,105
21.08.2019, 20:24 7
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 22
21.08.2019, 20:43  [ТС] 8
Цитата Сообщение от 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
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
21.08.2019, 23:03 9
Цитата Сообщение от Yuranga Посмотреть сообщение
Программа всегда выдаёт "Unknown symbol", даже если в тексте нет лишних символов.
Вероятно это происходит из-за того, что последним символ является символ конца файла из-за чего консоль выводит сообщение.

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

"починить" так:
C++
1
if(!fin) break;
Где именно в коде нужно добавить это добавить?
0
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
22.08.2019, 12:26 11
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2019, 12:26

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

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

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

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


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

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

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