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

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

Войти
Регистрация
Восстановить пароль
 
gap
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 13
#1

Архивация Хаффмана - C++

03.06.2014, 00:00. Просмотров 238. Ответов 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
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;
 
class Node
{
    public:
     int a;
     char c;
     Node *left, *right;
     
     Node(){left=right=NULL;}
 
     Node(Node *L, Node *R) 
     {  left =  L;
        right = R;
        a = L->a + R->a;  }
};
 
 
struct MyCompare
{
    bool operator()(const Node* l, const Node* r) const { return l->a < r->a; }
};
 
 
vector<bool> code;                
map<char,vector<bool> > table;    
 
void BuildTable(Node *root)
{   
    if (root->left!=NULL) 
                      { code.push_back(0);
                      BuildTable(root->left);}
     
    if (root->right!=NULL)
                       { code.push_back(1);
                       BuildTable(root->right);}
   
    if (root->c) table[root->c]=code;     
    
    code.pop_back();
}
 
 
int main (int argc, char *argv[])
{
////// считаем частоты символов 
    
    ifstream f("1.txt");
    
    map<char,int> m;
 
    while (!f.eof())
    { char c = f.get(); 
       m[c]++;}
    
  
////// записываем начальные узлы в список list
                 
   list<Node*> t;
   for( map<char,int>::iterator itr=m.begin(); itr!=m.end(); ++itr)
   {  
      Node *p = new Node;
      p->c = itr->first;
      p->a = itr->second;  
      t.push_back(p);      }    
    
 
//////  создаем дерево      
 
  while (t.size()!=1)
  {  
     t.sort(MyCompare());
    
     Node *SonL = t.front();
     t.pop_front();
     Node *SonR = t.front(); 
     t.pop_front();
     
     Node *parent = new Node(SonL,SonR); 
     t.push_back(parent);
 
  }
    
    Node *root = t.front();   //root - указатель на вершину дерева
 
////// создаем пары 'символ-код':           
 
    BuildTable(root);   
        
////// Выводим коды в файл output.txt
 
    f.clear(); f.seekg(0); // перемещаем указатель снова в начало файла
    
    ofstream g("output.txt", ios::out | ios::binary);
        
    int count=0; char buf=0;
    while (!f.eof())
    { char c = f.get();
      vector<bool> x = table[c];
      for(int n=0; n<x.size(); n++)
       {buf = buf | x[n]<<(7-count);   
        count++;   
        if (count==8) { count=0;   g<<buf; buf=0; } 
       }
    }
 
    f.close();
    g.close(); 
    
///// считывание из файла output.txt и преобразование обратно
 
    ifstream F("output.txt", ios::in | ios::binary);
 
    setlocale(LC_ALL,"Russian"); // чтоб русские символы отображались в командной строке
    
    Node *p = root;
    count=0; char byte; 
    byte = F.get();
    while(!F.eof())
    {   bool b = byte & (1 << (7-count) ) ; 
        if (b) p=p->right; else p=p->left;
        if (p->left==NULL && p->right==NULL) {cout<<p->c; p=root;}
        count++;
        if (count==8) {count=0; byte = F.get();}
    }
    
    F.close();  
 
    return 0;
}

Пользуюсь MSVS2010
Ошибки:

1>------ Построение начато: проект: 1, Конфигурация: Debug Win32 ------
1> код.cpp
1>g:\documents and settings\gap\рабочий стол\код\новая папка\1\1\код.cpp(53): error C2079: "f" использует неопределенный class "std::basic_ifstream<_Elem,_Traits>"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1>g:\documents and settings\gap\рабочий стол\код\новая папка\1\1\код.cpp(53): error C2440: инициализация: невозможно преобразовать "const char [6]" в "int"
1> Не существует контекста, в котором такое преобразование возможно
1>g:\documents and settings\amora\рабочий стол\код из часового видео\новая папка\1\1\код.cpp(57): error C2228: выражение слева от ".eof" должно представлять класс, структуру или объединение
1> тип: int
1>g:\documents and settings\gap\рабочий стол\код\новая папка\1\1\код.cpp(57): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2014, 00:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Архивация Хаффмана (C++):

Архивация подкаталогов - C++
Напишите программу, в последствии выполнения которой каждый подкаталог текущего каталога будет запакованный в отдельный .ZIP архив. ...

Архивация каталога С++ - C++
Нужно произвести архивацию каталога, возможно ли это в С++? Если да помогите кодом пожалуйста. Буду вечно благодарен.

Архивация строк - C++
Знаю, что С++ есть такая вещь как архивация строк, то есть в последовательности символов все одинаковые подряд, идущие символы заменяются...

Архивация + отправка по mySQL - C++
Кароче уже неделю где-то ищу нужный мне урок или исходник и всё насмарку, вот что нужно: 1. нужно файл с дериктории c:\\1.txt...

Шифрование и архивация данных - C++
Прошу помощи в написании программы на С++ шифрование и архивация данных

Шифрование Хаффмана - C++
Ребята есть код шифрования Хаффмана, он почему-то пропускает букву Н. Помогите пожалуйста разобраться int main(int argc, char *argv) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2014, 00:00
Привет! Вот еще темы с ответами:

Алгоритм Хаффмана - C++
Возможно и наболевшая тема на форуме, но всё же есть реализация алгоритма Хаффмана. Допустим, у меня в файле есть следующая строка: ...

Кодирование Хаффмана - C++
Есть дерево Хаффана, с помощью функции, приведенной ниже прохожусь по дереву и &quot;выписываю&quot; 0 и 1, получившиеся коды символов записываю в...

Кодирование Хаффмана - C++
Добрый вечер. Я за эту неделю малость зафлудил форум наверно. Прошу прощения за это. Просто уже не знаю, куда ещё обратиться со всем...

Сжатие Хаффмана - C++
Есть прога, реализующая сжатие Хаффмана: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;map&gt; #include...


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

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

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