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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
#1

Разбить файл на биты - C++

09.02.2012, 17:04. Просмотров 4522. Ответов 17
Метки нет (Все метки)

Каким образом осуществить разбиение файла на биты, а потом ещё его желательно будет и собрать.
Пока, собственно вопроса по коду нету, нужны лишь направления в правильную сторону.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 17:04     Разбить файл на биты
Посмотрите здесь:

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат - C++
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат.

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... - C++
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

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

Разбить текстовый файл на страницы - C++
Мне было задано 3 задачи две я решил, а вот одну не могу помогите пожалуйста. Постановка задачи: Я должен откыть текстовый файл, потом...

Разбить файл на текст и числа - C++
2.Дан текстовый файл. В каждом его строке первые 30 позиций отводятся под текст, а оставшаяся часть - под действительное число. Создать два...

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

Разбить файл на строки длиной не более 60 символов - C++
Проблема в том, что функция, работает не корректно... А вот понять в чем проблема я чет не могу... (Хотя есть ощущение, что функция...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,115
09.02.2012, 17:11     Разбить файл на биты #2
В общем-то он и так разбит на биты, в двоичном виде храниться же... Читаешь по байту, рассматриваешь в нём биты.
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 17:27     Разбить файл на биты #3
Цитата Сообщение от NoMasters Посмотреть сообщение
рассматриваешь в нём биты.
Для этого следует использовать класс std::bitset<>.
Байт
Эксперт C
15636 / 9978 / 1499
Регистрация: 24.12.2010
Сообщений: 18,742
09.02.2012, 18:27     Разбить файл на биты #4
cetrael, А Байт на Биты разбивается так
C
1
2
3
4
5
char B, Out[8];
for(i=0; i<8; i++) {
  k = ((B>>i)&1);
  Out[i] = k;
}
Добавлено через 57 секунд
По себе знаю
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:35     Разбить файл на биты #5
Если писать на простом Си - да, но на C++ следует использовать std::bitset<>.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <bitset>
 
using namespace std;
 
typedef unsigned char byte;
int main()
{
    cout << "Enter a byte [0..255]" << endl;
    unsigned int buffer;
    cin >> buffer; cin.get();
    byte myByte = static_cast<byte>(buffer);
    bitset<8> myBits(myByte);
    cout << "Bits: ";
    for (int i = 0, N = myBits.size(); i < N; ++i)
        cout << myBits[N - i - 1];
    cin.get();
}
retmas
09.02.2012, 20:23
  #6

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Байт на Биты разбивается так

По себе знаю
неплохо сказал

Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 21:08     Разбить файл на биты #7
Цитата Сообщение от Сtrl Посмотреть сообщение
но на C++ следует использовать std::bitset<>
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:20     Разбить файл на биты #8
Цитата Сообщение от Evg Посмотреть сообщение
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
Интересно вы это полезные команды считаете. Если отделить фрагмент, аналогичный коду из сообщения #4, то вот:
C++
1
2
unsigned char myByte;
bitset<8> myBits(myByte);
Теперь сравнение имеет смысл. Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 21:25     Разбить файл на биты #9
Цитата Сообщение от Сtrl Посмотреть сообщение
поскольку у меня код больше лишь потому, что там целая программа
Специально для тебя написал ведь "даже в пересчёте на полезные команды"

Цитата Сообщение от Сtrl Посмотреть сообщение
Вот теперь сравнение имеет смысл
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а. А пока твой код эквивалентент Си'шному коду

C
1
2
unsigned char myByte;
unsigned char myBits = myByte;
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:30     Разбить файл на биты #10
Цитата Сообщение от Evg Посмотреть сообщение
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а.
С позиции пользователя этот код идентичен (операция индексации). А с точки зрения реализации... Вы что, правда не знаете про инкапсуляцию, или шутите?
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 21:39     Разбить файл на биты #11
Цитата Сообщение от Сtrl Посмотреть сообщение
Вы что, правда не знаете про инкапсуляцию, или шутите?
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset

Добавлено через 1 минуту
Цитата Сообщение от Сtrl Посмотреть сообщение
Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
Вообще мы тут работаем не с массивами а с единичным байтом (ведь вся речь шла о том, что файл читаем побайтно, а затем выдираем из него биты)
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:43     Разбить файл на биты #12
Цитата Сообщение от Evg Посмотреть сообщение
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset
Как бы как только вы начали говорить об аналогичном коде на чистом Си - вы полезли в дебри реализации. Да, по сути там выходит вышеуказанное присваивание из char в char, даже дополнительные накладные расходы есть. Но это же черный ящик - какая разница, что внутри? Библиотечный класс предоставляет специальный интерфейс для работы с битами, в отличие от обычного массива char[8].
Цитата Сообщение от Evg Посмотреть сообщение
Вообще мы тут работаем не с массивами а с единичным байтом
С массивами. Или следующая строка такая неброская?
C
1
char B, Out[8]
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 22:01     Разбить файл на биты #13
Цитата Сообщение от Сtrl Посмотреть сообщение
С массивами. Или следующая строка такая неброская?
Давай возьмём твой пример (отбросив ненужное)

C++
1
2
3
4
byte myByte = ...;
bitset<8> myBits(myByte);
for (i = 0; i < N; i++)
  cout << myBits[N - i - 1];
и приведём к такому же виду вариант на Си

C
1
2
3
unsigned char myByte = ...;
for (i = 0; i < N; i++)
  cout << ((myByte >> i) & 1);
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи

А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:14     Разбить файл на биты #14
Цитата Сообщение от Evg Посмотреть сообщение
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи
Мне кажется, что не так, ибо иначе разбиение на биты вообще смысла не имеет. Для обыкновенного вывода на экран я нахожу ваш способ достаточным. Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Цитата Сообщение от Evg Посмотреть сообщение
А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален (да прибудет с вами Google).
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 22:21     Разбить файл на биты #15
Цитата Сообщение от Сtrl Посмотреть сообщение
Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Я ж не отказываюсь. Я всего лишь пытаюсь оспорить слово "следует", которое в данном контексте можно трактовать как какую-то обязаловку.

Цитата Сообщение от Сtrl Посмотреть сообщение
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален
Да пофиг откуда. Из описания я вижу, что заполнять большой bitset можно только побитно, но не побайтно
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 23:00     Разбить файл на биты #16
Цитата Сообщение от Evg Посмотреть сообщение
Да пофиг откуда. Из описания я вижу, что заполнять большой bitset можно только побитно, но не побайтно
http://stackoverflow.com/a/5239336
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
09.02.2012, 23:05     Разбить файл на биты #17
Что-то вот здесь http://cplusplus.com/reference/stl/bitset я не увидел операторов <<= и |=, потому и возник такой вопрос
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2012, 16:26     Разбить файл на биты
Еще ссылки по теме:

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

Задача на биты. - C++
Здраствуйте. С++ начал изучать недавно. И возникла проблема с решением задачи на биты. Вот собственно сама задача. Пока я выучил только...

Задача про биты - C++
Написать функцию, которая возвращает число, полученное из числа X,в котором все розряды, расположенные правее центральной позиции, заменены...

Инвентировать биты в байте - C++
Народ помогите пожалуйста как инвентировать биты в байте

Шумящие биты в WAV - C++
Вот такой вопросик как писать программу для сохранения собственного сообщение в звуковом файле расширения .WAV программа должна...


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
11.02.2012, 16:26     Разбить файл на биты #18
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
/////////////////////////////////////////////////////////////////////////////////////////
//Каким образом осуществить разбиение файла на биты, а потом ещё его желательно будет и собрать. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <bitset>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  bytesfile_to_bitsfile
    (
        const T_str&    bytes_filename,
        const T_str&    bits_filename
    )
{
    std::ifstream   ibytes_file     ( bytes_filename    .c_str(),   std::ios::binary    );
    std::ofstream   obits_file      ( bits_filename     .c_str()                        );
 
    char  byte_symb;
    while( ibytes_file.get(byte_symb) )
    {
        obits_file  <<  std::bitset<CHAR_BIT>(byte_symb).to_string();
    }    
}
/////////////////////////////////////////////////////////////////////////////////////////
void  bitsfile_to_bytesfile
    (
        const T_str&    bits_filename,
        const T_str&    bytes_filename        
    )
{
    std::ifstream   ibits_file      ( bits_filename     .c_str(),   std::ios::binary    );
    std::ofstream   obytes_file     ( bytes_filename    .c_str()                        );
 
    char    bit_symb;
    T_str   byte_str;
    while( ibits_file.get(bit_symb) )
    {
        byte_str += bit_symb;
        if( byte_str.size() == CHAR_BIT )
        {
            char  byte_symb     =   char( std::bitset<CHAR_BIT>(byte_str).to_ulong() );
            obytes_file         <<  byte_symb;
            byte_str.clear();
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  files_compare
    (
        const T_str&    L,
        const T_str&    R
    )
{
    std::ifstream   L_file      ( L.c_str(),    std::ios::binary    );
    std::ifstream   R_file      ( R.c_str(),    std::ios::binary    );
 
    std::ostringstream  L_sout;
    L_sout  <<  L_file.rdbuf();
 
    std::ostringstream  R_sout;
    R_sout  <<  R_file.rdbuf();
 
    return  L_sout.str()    ==  R_sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
void  random_fill_file
    ( 
        const T_str&    filename,
        int             symbols_total
    )
{
    std::ofstream   ofile( filename.c_str(),     std::ios::binary    );
    const char  char_min    =   std::numeric_limits<char>::min();
    const char  char_max    =   std::numeric_limits<char>::max();
    
    for(int  i = 0; i < symbols_total; ++i)
    {
        char    rand_symb   =   rand() % (char_max - char_min + 1) + char_min;
        
        if( !iscntrl(rand_symb) )
        {
            ofile.put(rand_symb);
        } 
    }
}
///////////////////////////////////////////////////////////////////////////////////////// 
void  print_file( const T_str&  filename )
{
    std::ifstream   ifile( filename.c_str() );
 
    std::cout   <<  std::endl
                <<  std::endl
                <<  std::endl
                <<  filename                
                <<  ":"
                <<  std::endl
                <<  std::endl
                <<  ifile.rdbuf()
                <<  std::endl
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    srand(unsigned(time(0)));
 
    const T_str     bytes_start_filename    =   "bytes_start.txt";
    const T_str     bits_filename           =   "bits.txt";
    const T_str     bytes_finish_filename   =   "bytes_finish.txt";
 
    const int       BYTES_START_FILE_SIZE   =   100;
    random_fill_file
        (
            bytes_start_filename,
            BYTES_START_FILE_SIZE
        );
    
    bytesfile_to_bitsfile
        (
            bytes_start_filename,
            bits_filename
        );
 
    bitsfile_to_bytesfile
        (
            bits_filename,
            bytes_finish_filename
        );
 
    std::cout   <<  (
                        files_compare
                            (
                                bytes_start_filename,
                                bytes_finish_filename
                            )
                            ? bytes_start_filename + " == " + bytes_finish_filename
                            : bytes_start_filename + " != " + bytes_finish_filename
                    )
 
                <<  std::endl;
 
    print_file( bytes_start_filename    );
    print_file( bits_filename           );
    print_file( bytes_finish_filename   );
}
Yandex
Объявления
11.02.2012, 16:26     Разбить файл на биты
Ответ Создать тему
Опции темы

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