Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848

Компрессия данных (вообще не понимаю ошибку)

10.05.2022, 21:08. Показов 2373. Ответов 24
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста

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
129
130
131
132
133
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
struct UnikSerii
{
    string Seriya;
    int ProcUp;
    int ProcDown;
 
};
 
int main()
{
    setlocale(0,"ru");
    ifstream DataFile("DataOfSeriya 01_05_2010 01_05_2022 SHAG_050.TXT");
    ofstream CompressedFile("DataOfSeriya 01_05_2010 01_05_2022 SHAG_050 Compressed.TXT");
 
    
 
    UnikSerii CompressedSerii[200];
 
    for (int i = 0; i < 200; i++)
    {
        CompressedSerii[i].Seriya = "";
        CompressedSerii[i].ProcUp = 0;
        CompressedSerii[i].ProcDown = 0;
    }
 
 
    int WriteUnik = 0;
 
 
    string DataLine;
 
    cout << "Пробую открыть файл с данными " << endl;
 
    if (!DataFile)
    {
        cout << "Не могу открыть файл\n";
    }
    else
    {
        cout << "Файл открыт\n";
    }
 
    for (int i = 1; !DataFile.eof(); i++)
    {
        getline(DataFile,DataLine);
        cout << DataLine << endl;
 
        if (WriteUnik == 0)
        {
            if (DataLine[0] == '1')
            {
                CompressedSerii[WriteUnik].ProcUp += 1;
            }
            if (DataLine[1] == '1')
            {
                CompressedSerii[WriteUnik].ProcDown += 1;
            }
            for (int i = 2; i < 22; i++)
            {
                CompressedSerii[WriteUnik].Seriya += DataLine[i];
            }
            WriteUnik += 1;
        }
        else
        {
            bool haveSeriya = false;
            string checkSeriya = "";
            int NumberSeriya;
            for (int i = 2; i < 22; i++)
            {
                checkSeriya += DataLine[i];
            }
 
            for (int i = 0; i < WriteUnik; i++)
            {
                if (checkSeriya == CompressedSerii[i].Seriya)
                {
                    haveSeriya = true;
                    NumberSeriya = i;
                }   
            }
 
            if (haveSeriya == true)
            {
                if (DataLine[0] == '1')
                {
                    CompressedSerii[NumberSeriya].ProcUp += 1;
                }
                if (DataLine[1] == '1')
                {
                    CompressedSerii[NumberSeriya].ProcDown += 1;
                }
            }
            else
            {
                if (DataLine[0] == '1')
                {
                    CompressedSerii[WriteUnik].ProcUp += 1;
                }
                if (DataLine[1] == '1')
                {
                    CompressedSerii[WriteUnik].ProcDown += 1;
                }
                for (int i = 2; i < 22; i++)
                {
                    CompressedSerii[WriteUnik].Seriya += DataLine[i];
                }
                WriteUnik += 1;
            }
        }
    }
 
    for (int i = 0; i < 200; i++)
    {
        string NewWrite = "";
        NewWrite += CompressedSerii[i].Seriya;
        NewWrite += " ";
        NewWrite += CompressedSerii[i].ProcUp;
        NewWrite += " ";
        NewWrite += CompressedSerii[i].ProcUp;
 
        CompressedFile << NewWrite;
    }
 
 
    return 0;
}


Есть файл, в котором имеется ряд записей в формате две цифры + 20 знаков. Цепочка знаков может повторяться, а вот цифры в начале имеют разные значения. Моя цель найти все одинаковые цепочки в файле, записать эту цепочку в структуру, и в зависимости от первых двух символов прибавить в поля структуры по единице (то есть статистика). Всё работает, но работает буквально пару секунд, далее вылетает ошибка с доступом для записи.
VS 2019
Вложения
Тип файла: zip DataOfSeriya 01_05_2010 01_05_2022 SHAG_050.zip (32.8 Кб, 2 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2022, 21:08
Ответы с готовыми решениями:

На 14 строчке выдает одну и ту же ошибку. Вообще не понимаю из-за чего
void predlozhenie(string ch)//Вывести текст, составленный из последних букв всех слов. { string ch2; int i = 0, j = 0; while (i...

Не понимаю ошибку при использовании базы данных
Всем привет System.Data.SqlClient.SqlException: 'Login failed for user 'userid'.' Такая ошибка This exception was originally...

Компрессия данных
Я хочу написать программу (что-то наподобие FreeARC) которая хорошо сжимает данные. Помогите мне подобрать алгоритмы компрессии для...

24
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
11.05.2022, 01:14  [ТС]
Студворк — интернет-сервис помощи студентам
....

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
UnikSerii *CompressedSerii = new UnikSerii[1048576]{};
Поехало)) Тупенький я, извините

Добавлено через 2 часа 34 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
UnikSerii *CompressedSerii = new UnikSerii[1048576]{};
В общем да, это сработало. И спасибо за подсказку как считать уникальные комбинации, мой навык гугления меня подвел. Я уменьшил цепочку до 8 элементов, чего под мою задачу тоже хватит и уникалов будет не миллион, вы мне очень сильно помогли
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
11.05.2022, 02:10
Цитата Сообщение от Laborant666 Посмотреть сообщение
Я уменьшил цепочку до 8 элементов, чего под мою задачу тоже хватит
На самом деле ваши последовательности из +- можно рассматривать как числа, записанные в двоичной системе счисления, только при помощи +- вместо 01. Если вы будете представлять эти последовательности именно как числа, а не как строки, то и места в памяти они будут занимать намного меньше, и сравнение и поиск работать будет намного быстрее.

А в случае длины 8 и поиск на самом деле не нужен. Можно напрямую адресовать массив такими индексами.
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
11.05.2022, 15:13  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
На самом деле ваши последовательности из +- можно рассматривать как числа, записанные в двоичной системе счисления, только при помощи +- вместо 01
Об этом я подумал только после сна, отсюда и понял почему 2^20 было. Поиск сравнительно быстр, дело не в скорости, эту операцию мне нужно сделать один только раз (если бы более, то имеет смысл представить цепочку как числа)

Добавлено через 58 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Почему в программе используется функция eof. Что она должна здесь делать?
Решил проблему. После считывания в брейк и не считывает два раза, ну точнее считывается, но уже не обрабатывается считанное за концом файла

C++
1
2
3
getline(DataFile,DataLine);
        if (DataFile.eof())
            break;
Добавлено через 40 секунд
Всё же, как оказалось, вылетало по eof в прошлом варианте, это я не туда вчера смотрел по логам
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
11.05.2022, 18:42
Цитата Сообщение от Laborant666 Посмотреть сообщение
но уже не обрабатывается считанное за концом файла
Можно лишь повторить, что в вашей программе не должно быть никаких обращений к функции eof.

Главный цикл должен выглядеть примерно так

C++
1
2
3
4
5
6
7
8
9
10
do
{
  if (!getline(DataFile,DataLine))
    break;
  if (DataLine.empty())
    continue;
 
  // Обработка...
 
} while (true);
Это сделано в предположении, что пустые строки могут встретиться и в середине файла. Хотя, конечно, вместо проверки DataLine.empty() уместнее чуть более продвинутая проверка на "это что-то, что не подлежит обработке".
0
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
16.05.2022, 14:11  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Главный цикл должен выглядеть примерно так
хм, а идея хороша, спасибо, возьму на вооружение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2022, 14:11

вообще не понимаю строк
. Дана строка символов S. Известно, что символ s1 отличен от восклицательного знака и что среди s2, s3, … есть по крайней мере один...

Рекурсия в JavaScript. Не понимаю вообще
Все привет! Не понимаю, как работают рекурсии! Рекурсия - это когда функция вызывает саму себя. Ну, ок...пытаюсь разобраться с примерами и...

Вообще не понимаю что происходит(
Мне дали модуль с процедурой для работы с SQL, но я в толк не возьму чем эта процедура вообще занимается: Procedure...

битовые операции не понимаю вообще
функция изменяет старший байт числа на заданное значение не изменяя младший байт пожалуйста помогите

, сижу на лр и вообще не понимаю как сдлеать!
Заранее огромное спасибо! три номера под номером 12. вообще не понимаю как сделать =(


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru