Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
1

Побитовое чтение/запись в файл

19.05.2015, 11:05. Просмотров 3752. Ответов 10
Метки нет (Все метки)

Добрый день.
Мне нужно реализовать класс, который дает возможность побитовой записи/четения в/из файла.
Я на самом деле не очень хорошо представляю, как это возможно. Ведь запись у нас только побайтово.

Кто сможет подсказать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2015, 11:05
Ответы с готовыми решениями:

Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление)
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на...

Побитовое чтение
Есть файл видео и мне известна его структура. Например структура следующая:...

Открытие и побитовое чтение jpeg-файла
Здравствуйте уважаемые участники форума. Прошу подсказать, как лучше...

какая функция осуществляет побитовое чтение файла
какая функция осуществляет побитовое чтение файла подскажите кто знает ...

Чтение и запись в файл
Задача такая: Есть файл data.txt, в нем хранятся фамилии, номера телефонов и...

10
CheshireCat
Эксперт С++
2913 / 1262 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
19.05.2015, 11:59 2
А в чем может быть проблема?
1. Внутри класса группируешь биты по 8 (точнее, по CHAR_BIT), но читаешь-пишешь только нужный бит,
2. А читаешь-пишешь в/из файла байтами.
1
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
19.05.2015, 12:21  [ТС] 3
Ну допустим пользователь ввел нам строку: "hello world"
Как мне ее поБИТово записать?
Извиняюсь за мое слабоумие

Добавлено через 2 минуты
Ну и соответственно считать.
Буду очень благодарен за разъяснение
0
CheshireCat
Эксперт С++
2913 / 1262 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
19.05.2015, 13:33 4
Стоп! Вот в формулировке исходной задачи:
Цитата Сообщение от sxsxsx Посмотреть сообщение
Мне нужно реализовать класс, который дает возможность побитовой записи/четения в/из файла.
- где у тебя сказано хоть что-нибудь про строки вообще и "hello world" в частности?

А побитовая запись проста:
01101000 01100101 01101100 01101100 .... и так далее. Ну и, конечно, не забудь подумать о последовательности записи младших и старших битов - откуда начинать?
0
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
19.05.2015, 13:54  [ТС] 5
т.е. я создаю байт как массив битов. И потом их побитово записываю/считываю? Верно?
0
CheshireCat
Эксперт С++
2913 / 1262 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
19.05.2015, 14:06 6
Да. Только обрати внимание еще раз - в файл ты можешь писать/читать только побайтово.
0
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
19.05.2015, 14:09  [ТС] 7
.write() - этой же функцией мне записывать? сайзом = 1 байт? т.е. sizeof(s[8])?
0
gazlan
3143 / 1919 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
19.05.2015, 14:14 8
Цитата Сообщение от sxsxsx Посмотреть сообщение
подсказать
Взять исходный код почти любого файлового компрессора. Например, Bitfile IO Module
0
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
19.05.2015, 16:49  [ТС] 9
объявления байта:

bool name[CHAR_BIT];

Так?

Добавлено через 1 час 30 минут
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
#include "stdafx.h"
#include <limits>
#include <iostream>
#include <fstream>
using namespace std;
 
class bitEnter{
    bool byte[CHAR_BIT];
public:
    bitEnter();
    void bitUserEnter();
    void inFile(char* argv);
    void fromFile(char* argv);
 
};
 
bitEnter::bitEnter(){
    for(int i=0; i<CHAR_BIT; i++)
        byte[i]=0;
}
 
void bitEnter::bitUserEnter(){
    for(int i=0; i<CHAR_BIT; i++)
    {cout<<"enter the "<<i+1<<"th bit: \t"; cin>>byte[i];}
}
 
void bitEnter::inFile(char* argv){
    ofstream out;
    out.open(argv, ios::end);
    out.write(reinterpret_cast<char*>(&byte), sizeof(byte));
    out.close();
}
 
void bitEnter::fromFile(char* argv){
    ifstream in;
    in.open(argv);
    while (!in.eof()){
        in.read(reinterpret_cast<char*>(&byte), sizeof(byte));
        for(int i=0; i<CHAR_BIT; i++)
            cout<<byte[i]<<"\t";
        cout<<endl;
    }
    in.close();
}
 
 
int _tmain(int argc, char* argv[])
{
    bitEnter byte;
    cout<<"Какое количество байтов вы хотите записать?"<<endl;
    int num;
    cin>>num;
    for(int i=0;i<num;i++){
        byte.bitUserEnter();
        byte.inFile(argv[1]);
    }
    byte.fromFile(argv[1]);
    system("pause");    
    return 0;
}
Вроде все работает. Только проблема в том. Что когда он выводит из файла - он в любом случае выводит 2 раза байт, который ввели последним

Добавлено через 10 минут
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
#include "stdafx.h"
#include <limits>
#include <iostream>
#include <fstream>
using namespace std;
 
int main(){
    bool mas[8];
    ofstream file;
    file.open("out1.txt");
    for (int j=0; j<3;j++){
    for(int i=0; i<8; i++)
        {cin>>mas[i];}
    file.write(reinterpret_cast<char*>(&mas), sizeof(mas));
    cout<<"-------------"<<endl;
    }
 
    file.close();
    ifstream g;
    g.open("out1.txt");
    for (int j=0; j<3;j++){
    g.read(reinterpret_cast<char*>(&mas), sizeof(mas));
    for(int j=0; j<8; j++)
        cout<<mas[j]<<"\t";
    cout<<endl;
    }
    cout<<endl;
    system("pause");
}
А когда вот так - все отлично
0
sxsxsx
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 8
26.05.2015, 12:40  [ТС] 10
Был бы очень благодарен, если бы кто-то мог ответить на вышепоставленный вопрос
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
26.05.2015, 13:54 11
Цитата Сообщение от sxsxsx Посмотреть сообщение
объявления байта:
bool name[CHAR_BIT];
Так?
Переменная bool занимает в памяти минимум 1 байт, поэтому это вы задали минимум CHAR_BIT байтов.
Чтобы задать байт, определите переменную типа char, она гарантированно займёт один байт. Чтобы обратиться к отделльным битам в этой переменно нужно использовать побитовые операции.
C++
1
2
3
4
unsigned char byte;
byte & (1 << N);        // считать N-ый бит переменной byte
byte |= (1 << N);      // установить N-ый бит в 1
byte &= ~(1 << N);   // Установить N-ый бит в 0
Правда, когда мне приходилось работать с битами, мне больше понравился класс bitset из стандартной библиотеки.
C++
1
2
3
bitset<CHAR_BIT> byte;
byte[N];     // N-ый бит, именующее выражение
reinterpret_cast<char>(byte.to_ulong());    // в таком виде можно записывать в файл
Добавлено через 1 минуту
Напоследок, хочу добавить, что в байте не всегда 8 бит. Однако стандарт гарантирует, что char занимает ровно один байт. И переменная типа char состоит из CHAR_BIT бит
0
26.05.2015, 13:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2015, 13:54

Чтение и запись в файл
Подскажите, как сделать так, чтобы информация считывалась с текстового файла, а...

Чтение и запись в файл
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; void main() {...

Чтение и запись в файл
В общем мне нужно читать из файла таблицу и пихать её в стек, а так же этот...


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

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

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