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

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

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

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

03.06.2014, 00:00. Просмотров 229. Ответов 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 ==========
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2014, 00:00     Архивация Хаффмана
Посмотрите здесь:

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

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

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

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

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

Архиватор Хаффмана c++ - C++
Пишу архиватор на c++ методом Хаффмана. Не могу найти как считывать байты из файла в c++.

Сжатие Хаффмана - C++
Как изменить данный алгоритм, чтобы ограничить длину кода символа заданным числом Nmax? Спасибо! #include &quot;stdafx.h&quot; #include...

Код Хаффмана - C++
Всем доброго дня! имеется код хафманна, работает, но считает неправильно! кто может объяснить в чем дело? #include &lt;iostream&gt; ...

Кодирование Хаффмана - 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...

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


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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