Форум программистов, компьютерный форум CyberForum.ru

Не могу дописать метод перевода в десятичного кода символа в двоичный в алгоритме LZW - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Редактирование файлов шрифтов http://www.cyberforum.ru/cpp/thread129740.html
Здравствуйте! Я пишу (на с++) редактор шрифтов (пока что *.otf, *.ttf, *.ttc)... 1-я задача - удаление из шрифта указанного набора символов, и всей с вязаной с ними информации... последовательность действий примерно такая: 1) загрузить файл шрифта 2) отредить 3) сохранить ссылки на спеки по шрифтам: http://www.microsoft.com/typography/otspec/ http://developer.apple.com/fonts/TTRefMan/
C++ исправить программу Помогите исправить программу #include <iostream> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <fstream.h>; #pragma argsused using namespace std; http://www.cyberforum.ru/cpp/thread129706.html
C++ Поиск пути в лабиринте
Есть двухмерный массив : 1 - препятствие, 0 - проход. Нужно найти кратчайший путь от одной точки до другой. У меня есть волновой алгоритм, он всё прекрасно находит ,но он не ищет пути по диагонали, а мне это нужно позарез. Если у кого есть такой алгоритм поделитесь плз..
SDL C++
Как реализовать "откусывание" области игрового поля при проходе ?? по типу Air-x sonics..
C++ Заставить программу считать сумму индексов положительных чисел http://www.cyberforum.ru/cpp/thread129476.html
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> #include <time.h> void RandomFill(double A, int n); void PrintArray(double A, int n); double sum(double A, int n);
C++ Матрица Заполнить матрицу линейного порядка, от левого нижнего угла по диагонали, влево - вверх. Посмотрите,пожалуйста, может у кого-то получится, а то очень нужно. подробнее

Показать сообщение отдельно
kamberb
Сообщений: n/a

Не могу дописать метод перевода в десятичного кода символа в двоичный в алгоритме LZW - C++

14.05.2010, 22:58. Просмотров 536. Ответов 0
Метки (Все метки)

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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
 
class Lzw
{
    // Вспомогательный класс, описывающий элемент в таблице
    class CodeTableItem
    {
    public:
        string str;
    };
 
    // Указатель на массив, содержащий таблицу
    CodeTableItem* codeTable;
    // Размер таблицы
    int tableSize;
 
    // Вспомогательный метод, начальная подготовка таблицы
    void initTable()
    {
        for (int i=0; i < tableSize; i++)
        {
            if (i < 256)    // Первые 256 элементов инициализируем исходным алфавитом
            {
                codeTable[i].str = "";
                codeTable[i].str += char(i);
            }
            else // Остальные пустые
                codeTable[i].str = " ";
        }
    }
 
    // Вспомогательный метод, возвращает код по заданной строке, 
    // или -1, если строки нет в таблице
    int getCode(const string& str)
    {
        for (int i=0; i < tableSize; i++)
            if (codeTable[i].str == str)
                return i;
 
        return -1;
    }
 
    // Вспомогательный метод, записывает код в выходной файловый поток
    void writeCode(int code, ofstream& fout)
    {
        fout<<code;
    }
 
    // Вспомогательный метод, определяет строку по коду
    string getString(int code)
    {
        return codeTable[code].str;
    }
 
    // Вспомогательный метод, проверка кода (есть в таблице или нет)
    bool inTable(int code)
    {
        return (! codeTable[code].str.empty() );
    }
 
 
public:
    // Конструктор класса
    Lzw() 
    {
        // 4096 =  2^12, значит такой таблицы хватит для кодов длиной до 12ти бит
        tableSize = 4096;
        // Выделяем память под таблицу
        codeTable = new CodeTableItem[tableSize];
 
        // Начальная подготовка таблицы
        initTable();
    };
 
 
    // Метод сжатия
    void compress(const char* inFile, const char* lzwFile)
    {
        // Открываем входной файл
        ifstream fin(inFile);
        // Открываем выходной файл
        ofstream flzw(lzwFile);
 
        // Значение следующего кода (коды от 0 до 255 уже заняты исходным алфавитом)
        int nextCode = 256;
 
        // Читаем очередной байт из файла
        char c = fin.get();
        
        // Рабочая строка, содержащая текущую цепочку
        string buf;
        
        // Цикл до конца файла
        while (fin)
        {
            // Вычисляем код для очередной цепочки
            int code = getCode(buf + c);
            int newcode=getCode(buf);
            int prob, w[32];
            // Код не найден
            if (code == -1)
            {
 
                
                for(int i=0;i<32;i++)
                {
                     w[i]=((newcode>>i)&1);
                 }
                for(int i=31,r=0;i>=0;i--)
                 { 
                      if((w[i]==1)||(r==1))
                 {
                     
                     int temp=0;
                     temp=w[i];
                     prob=temp;
                     writeCode(prob, flzw);
                      r=1;
    }
    }
                
                // Записываем код для предыдущей цепочки в выходной файл
                
                // Заполняем таблицу новой цепочкой
                codeTable[nextCode].str = buf + c;
                nextCode++;
                // Сбрасываем текущую цепочку (остается только последний символ)
                buf = "";
                buf += c;
            }
            else // Код найден, наращиваем цепочку
            {
            buf += c;
            
            }
 
            // Читаем следующий символ
            c = fin.get();
        }
    
        // Записываем код для последней цепочки
 
        writeCode(getCode(buf), flzw);
 
        // Закрываем файлы
        fin.close();
        flzw.close();
    }
    };
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Lzw t;
    
    t.compress("input.txt", "lzw.txt");
 
    //t.decompress("lzw.txt", "output.txt");
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru