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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Levenyatko
2 / 2 / 0
Регистрация: 05.07.2012
Сообщений: 99
#1

Как символ конца файла выглядит в двоичном представлении? - C++

10.05.2013, 21:25. Просмотров 3507. Ответов 7
Метки нет (Все метки)

Пытаюсь реализовать Хаффмана и столкнулась с такой проблемой: когда я записываю сформированный код в файл у меня в некоторых байтах получается символ конца файла.. как он выглядит в двоичном представлении? и если можете подскажите как сделать так чтобы исправить это..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2013, 21:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как символ конца файла выглядит в двоичном представлении? (C++):

Строквой литерал в двоичном представлении - C++
Добрый день. В учебнике есть задание: составить пользовательский тип который может вместить значение факториала числа 1000 с абсолютной...

Вывод числа в двоичном представлении - C++
Задача: представить число long double в двоичном коде. Использую для этого union, но на экран упорно выводится только половина числа....

Определить каких цифр больше в двоичном представлении - C++
Определить каких цифр больше в двоичном представлении натурального числа N - нулей и единиц. Ввод натуральное число 13 Вывод "0" - если...

Вывести в двоичном представлении все натуральные числа от 1 до N - C++
Задача : вывести в двоичном представлении все натуральные числа от 1 до N. Вопрос : есть ли алгоритм для очень больших N? Сама тема работы...

Вывести введённое неотрицательное число в двоичном, восмиричном и шестнадцатеричном представлении - C++
Добрый день. Ребята помогите пожалуйста сделать: ввести неотрицательное число и вывести его в двоичном,восмиричном и шестнадцатеричном...

Сравнить младший бит в двоичном представлении определённых целых значений - C++
Напишите программу, которая сравнивает младший бит в двоичном представлении определённых целых значений A и B. C++

7
anmartex
...
1708 / 1201 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
10.05.2013, 21:56 #2
Цитата Сообщение от Levenyatko Посмотреть сообщение
как он выглядит в двоичном представлении?
C
1
2
3
4
5
6
7
#include <stdio.h>
 
int main()
{
   printf("%x", EOF);
   return 0;
}
output:
Код
ffffffff
Добавлено через 10 минут
Levenyatko, хотя я на сколько понимаю, завершающего символа в принципе не может быть. EOF это всего-лишь значение возвращаемое feof() в случае достижения конца.

Добавлено через 12 минут
Ошибся
1
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
11.05.2013, 00:24 #3
Цитата Сообщение от Levenyatko Посмотреть сообщение
Пытаюсь реализовать Хаффмана и столкнулась с такой проблемой: когда я записываю сформированный код в файл у меня в некоторых байтах получается символ конца файла..
Дабы исключить всякие сюрпризы делайте запись/чтение в файл в бинарном режиме.

Цитата Сообщение от Levenyatko Посмотреть сообщение
как он выглядит в двоичном представлении? и если можете подскажите как сделать так чтобы исправить это..
Исправлять ничего не надо. Тот символ конца файла, которое возвращается функциями чтения, является отдельным специальным условным обозначением.

Цитата Сообщение от anmartex Посмотреть сообщение
Ошибся
Вас немного не туда занесло.
0
Levenyatko
2 / 2 / 0
Регистрация: 05.07.2012
Сообщений: 99
11.05.2013, 00:29  [ТС] #4
а в с++ это надо флаг поставить для чтения в бинарном режиме..правильно?
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
11.05.2013, 00:36 #5
Да, при открытии файла, http://cplusplus.com/reference/fstream/fstream/open/, и использовать специальные функции read/write
http://cplusplus.com/reference/istream/basic_istream/read/
http://cplusplus.com/reference/ostream/basic_ostream/write/
1
Levenyatko
2 / 2 / 0
Регистрация: 05.07.2012
Сообщений: 99
11.05.2013, 16:38  [ТС] #6
kazak, сделала чтение и запись в бинарном режиме..без разницы ему что как читать и записывать..всеравно не хочет
0
stima
494 / 344 / 43
Регистрация: 22.03.2011
Сообщений: 1,105
Завершенные тесты: 2
11.05.2013, 16:41 #7
Покажите код
0
Levenyatko
2 / 2 / 0
Регистрация: 05.07.2012
Сообщений: 99
11.05.2013, 17:20  [ТС] #8
stima,

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
169
170
171
172
173
174
175
176
177
178
179
180
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;
 
class Node
{
    public:
     int Frequency;
     char Symbol;
     Node *left, *right;
     
     Node(){left=right=NULL;}
 
     Node(Node *L, Node *R) 
     {  left =  L;
        right = R;
        Frequency = L->Frequency + R->Frequency; 
     Symbol = NULL;
     }
};
 
 
struct MyCompare
{
    bool operator()(const Node* l, const Node* r) const { return l->Frequency < r->Frequency; }
};
 
 
vector<bool> code;                
map<char,vector<bool> > table;    
 
map<char, int> one;
 
void BuildTable(Node *root)
{   
    if (root->left!=NULL) 
                      { code.push_back(1);
                      BuildTable(root->left);}
     
    if (root->right!=NULL)
                       { code.push_back(0);
                       BuildTable(root->right);}
   
    if (root->Symbol) table[root->Symbol]=code;     
    
    code.pop_back();
}
 
 
int main (int argc, char *argv[])
{
    setlocale(LC_ALL,"rus");
////// считаем частоты символов 
    
    ifstream f("one.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->Symbol = itr->first; //cout<<p->c<<"  ";
      p->Frequency = itr->second;//cout<<p->a<<endl;  
      t.push_back(p);      }    
    
 
//////  создаем дерево      
 
  while (t.size()!=1)
  {  
     t.sort(MyCompare());
     /*cout<<"__________"<<endl;
     for(list<Node*>::iterator i= t.begin();i!= t.end();++i)
     {
         cout<<(*i)->a<<(*i)->c<<endl;
     }
     cout<<endl<<endl;
     system("pause");*/
     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); // перемещаем указатель снова в начало файла
    
    fstream g;
    g.open("output.txt", fstream::out, fstream::binary);
        
    int count=0; char buf=0;
    //вывод пар символ - код
    /*
    for(map<char,vector<bool> >::iterator i = table.begin();i!=table.end();i++)
    { 
        cout<<i->first<<"  ";
        vector<bool> vec = i->second;
        for(vector<bool>::iterator itr=vec.begin();itr!=vec.end();itr++)
            cout<<*itr;
        cout<<endl;
    }*/
    //while (!f.eof())
    while(f)
    { 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;
            g.write(&buf,sizeof(char));
            buf=0; 
        } 
       }
    
   }
    f.close();
    g.close(); 
    
///// считывание из файла output.txt и преобразование обратно
    
    fstream F;
    F.open("output.txt", fstream::in, fstream::binary);
    fstream e;
    e.open("put.txt", fstream::out, fstream::binary);
 
    Node *p = root;
    count=0; char byte; 
    //F>>byte;
    F.read(&byte,sizeof(char));
    
    //while(!F.eof())
    while(F)
    {   
//      bool b = byte & (1 << (7-count) ) ; 
                char b = byte & (1 << (7-count) ) ; 
        if (b) p=p->left; else p=p->right;
        //if (p->left==NULL && p->right==NULL) {cout<<p->c; p=root;}
        if (p->Symbol!=NULL) {e.write(&p->Symbol,sizeof(char)); p=root;}
        count++;
        if (count==8) 
        {
            count=0;
        //  F>>byte;
            F.read(&byte,sizeof(char));
        
        }
    }
    
    F.close();  
    e.close();
    system("pause");
    return 0;
}
0
11.05.2013, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 17:20
Привет! Вот еще темы с ответами:

Произвести в двоичном представлении числа обмен битов с заданными номерами - C++
Дано короткое целое неотрицательное число. Произвести в его двоичном представлении обмен битов с номерами 0 и 1, 2 и 3, 4 и 5 и т.д. ...

Подсчетать количество единичных разрядов на нечетных местах в двоичном представлении числа - C++
4. Записать программу для подсчета количества единичных разрядов на нечетных местах в двоичном представлении заданного целого числа (...

Определить в двоичном представлении числа максимальное количество расположенных рядом единиц - C++
Дано короткое целое неотрицательное число. Определить в его двоичном представлении максимальное количество расположенных рядом единиц.

Определить, сколько единиц содержится в двоичном представлении переменной типа char - C++
Помогите чайнику....Напишите програмку на C++, которая определяет сколько единиц содержится в двоичном представлении переменной типа...


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

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

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