Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.73
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
#1

Кодирование длин серий RLE - C++

20.04.2014, 23:08. Просмотров 5910. Ответов 24
Метки нет (Все метки)

Есть код алгоритма кодирования длин серий RLE.
Но есть траблы с декодированием
Вот код
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{   
    std::ifstream file("INPUT_TEXT.txt");
    std::ofstream file_compr("COMPRESSED_TEXT.txt");
    
    char sym;//символ, который мы будем считывать
    int kol=1;// количество повторяющихся символов
 
    while(!file.eof())
    {
        file.get(sym);//считываем символ
        if(sym!=file.peek())// если символ не совпадает со слеующим символом в файле
        {
            file_compr<<kol<<sym;// записываем результаты в выходной файл
            kol=0;
        }
        kol++;
    }
 
    std::ifstream f1("COMPRESSED_TEXT.txt");
    std::ofstream file_decompr("DECOMPRESSED_TEXT.txt");
 
    char sym1,sym2;// предыдущий и последующий символы
    while(f1.peek()!=EOF)
    {
        f1>>sym1>>sym2;// считываем символы
        for(int i=0;i<sym1-48;i++)
            file_decompr<<sym2;
    }
 
    system("PAUSE");
    return 0;
}
Добавлено через 18 секунд
Нужна помощь))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Кодирование длин серий RLE (C++):

Кодирование длин серий (RLE) - C++
Я уже полдня пытаюсь ошибку найти, всё 100 раз перепроверил и не могу всё равно найти в чем ошибка. У меня на входе файл 92,8 КБ, а на...

Алгоритм кодирование длин серий - C++
Помогите данный код реализовать взяв за блок данных: char data = {'a','a','a','a','a','c','b','b','c','c','g','k','b','b','b','b'}; ...

Алгоритм RLE - C++
Всех приветствую, нужна помощь, уже устал, суть такая: необходимо реализовать алгоритм RLE, при этом единичные символы записываются так,...

RLE компресія на с++ - C++
есть програма int main(int argc, char* argv) { FILE *Pfile1 = fopen(&quot;test2.txt&quot;,&quot;rb&quot;); if(Pfile1 == NULL) { cout &lt;&lt;&quot;eror...

Метод RLE - C++
Написать программу сжатия полутонового bmp* файла по методу RLE

Алгоритм RLE - C++
Прошу помочь выйти мне из тупика) Подсказки,исправление ли направление что и где исправлять. Задачи: 1. Написать функции чтения и...

24
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,371
21.04.2014, 07:08 #2
Не будет так работать. Когда записываешь количество, оно должно быть фиксированной длины, например 2 символа. Соответственно длины будут от 01 до 99. Это если всё текстом сохранять.

Добавлено через 6 минут
Скажем, "БББ" должно стать "Б03". Извлекать посимвольно get(sym); get(len1); get(len2);. Потом len1 и len2 объединять в строку, конвертировать в число повторений.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.04.2014, 08:55 #3
Это просто пример, там изначально предполагается, что повторений не будет больше 9.
0
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,371
21.04.2014, 11:02 #4
В любом случае экстрактор замени на get и цикл не с peek, а также как первый с eof().

Добавлено через 1 минуту
Потоки не забывай закрывать.
0
Kuzia domovenok
2042 / 1887 / 172
Регистрация: 25.03.2012
Сообщений: 6,499
Записей в блоге: 1
21.04.2014, 11:44 #5
Цитата Сообщение от Toshkarik Посмотреть сообщение
там изначально предполагается, что повторений не будет больше 9.
а ты откуда знаешь?
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.04.2014, 11:57 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а ты откуда знаешь?
Да все оттуда же.
0
Kuzia domovenok
2042 / 1887 / 172
Регистрация: 25.03.2012
Сообщений: 6,499
Записей в блоге: 1
21.04.2014, 12:41 #7
Toshkarik, в смысле? Ты сам писал этот пример что ли?
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.04.2014, 13:01 #8
Нет. Но, прочитав бегло пост по ссылке, понял с первого раза. Там все вполне понятно описано, у автора была цель показать суть, а не предоставить готовое решение, которое, кстати, не всегда тривиальное.
0
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
21.04.2014, 16:52  [ТС] #9
nmcf, а если записывать число в типе int? Ну и сделать считывание таким образом : число->символ->декодирование. До конца файла естественно.
0
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,371
21.04.2014, 16:57 #10
Можно и в int, но нужно точно определиться с количеством байт текстового представления этого int. Делай тогда проверку, чтобы кодировалось не больше 9 символов в последовательности.

Добавлено через 1 минуту
Ты раскодировку исправил на get()?
0
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
21.04.2014, 17:36  [ТС] #11
nmcf, еще нет

Добавлено через 7 минут
вот
C++
1
2
3
4
5
6
7
8
9
10
    char sym1;// предыдущий и последующий символы
    int sym2;
    while(!f1.eof())
    {
        f1>>sym1>>sym2;// считываем символы
        //f1.get(sym1);
        //f1.get(sym2);
        for(int i=0;i<sym1-48;i++)
            file_decompr<<sym2;
    }
ничего не изменилось
скорее всего, я не правильно прописал считывание
0
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,371
21.04.2014, 20:53 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так работает, но у меня почему-то количество последнего символа удваивается. Проверь у себя.
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
    ifstream file("INPUT_TEXT.txt");
    ofstream file_compr("COMPRESSED_TEXT.txt");
    
    char sym; //символ, который мы будем считывать
    int kol=1;// количество повторяющихся символов
 
    while(file.good())
    {
        file.get(sym);//считываем символ
        if(sym != file.peek() || kol == 9)// если символ не совпадает со следующим символом в файле
        {
            file_compr << kol << sym;
            // записываем результаты в выходной файл
            kol=0;
        }
        kol++;
    }
 
    file.close();
    file_compr.close();
 
    ifstream f1("COMPRESSED_TEXT.txt");
    ofstream file_decompr("DECOMPRESSED_TEXT.txt");
 
    char sym1,sym2;// предыдущий и последующий символы
    const char zero = '0';
    while(f1.good())
    {
        f1.get(sym1);
        f1.get(sym2);
        for(int i=0; i < sym1-zero; i++)
            file_decompr << sym2;
    }
 
    f1.close();
    file_decompr.close();
 
    system("PAUSE");
    return 0;
1
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
21.04.2014, 22:35  [ТС] #13
nmcf, да, есть такое.
не пойму, зачем менять кодирование на части по 9 штук?
0
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,371
21.04.2014, 23:11 #14
Чтобы длина обозначалась одним символом. 10 - это уже 2 символа. Можно и под такое сделать программу. Только тогда придётся лидирующие нули дописывать. Либо надо работать с закодированным файлом как с бинарным, тогда до 255 можно.

Меня вот проблема с удвоением волнует.
0
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
21.04.2014, 23:57  [ТС] #15
nmcf, допустим, что реализовать кодирование таким образом - пусть не самый хороший способ, но его удобно использовать для декодирования. Тогда вопрос есть:
Цитата Сообщение от nmcf Посмотреть сообщение
const char zero = '0';
для чего это?
0
21.04.2014, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 23:57
Привет! Вот еще темы с ответами:

алгоритм RLE - C++
Нужна помощь. Чтобы сделать алгоритм сжатия RLE на с++

Компрессия RLE - C++
Здравствуйте. Требуется помощь по реализации кода. Задание следующее : Реализовать класс RLE который будет компрессить массив байт и...

Компрессия и декомпрессия RLE - C++
Всем привет. Ребята подскажите пожалуйста, что нужно изменить в этом коде, чтобы он расшифровывал символы, которые были зашифрованы с...

Реализация алгоритма RLE - C++
Есть задачка, надо реализовать две функции &quot;закодировать&quot; и &quot;раскодировать&quot; массив данных типа: char mass =...


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

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

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