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

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

Войти
Регистрация
Восстановить пароль
 
 
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
#1

Запись в фаил - C++

11.04.2010, 14:15. Просмотров 827. Ответов 18
Метки нет (Все метки)

Здравствуйте, возник вопрос,возможно он покажется немного странным , но всё же хД

Суть такая:
нужно было придумать некий простенький алгоритм шифрования строк char, чтобы результат записывался в фаил.
Собственно я его придумал, провёл кое-какие расчёты.
12 Символьная строка шифруеться в 144 ' бита '(ну т.е. бита всмысле 144 символа 0 или 1 )
Так вот.если эти 144 записывать в фаил , то получиться ,что размер строки увеличиться в 12 раз, потому-что эти 'биты' запишуться всё равно как символы - слишком большой коэффициент увеличения =(
В то же время, если подсчитать
12 символов = 12*8 бит
144 бита = 144/8 символов = 18 символов.
То биш по идее увеличение строки всего в 1.5 раза - это уже приемимый результат.
Вот собственно вопрос.
Можно ли записать фаил таким образом , чтобы 'биты' записывались не как символы(которые весят 8 бит) а сами как биты ?


Ну если я всё правильно понимаю,если нет - поправте.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2010, 14:15     Запись в фаил
Посмотрите здесь:

Запись в фаил - C++
Подскажите как осуществить запись в фаил определенным шрифтом, например шрифтом Arial или Calibri или Times New Roman. Заранее спасибо.

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

фаил в функцию - C++
Пишу прогу нужно передать фаил в функцию для обработфи но возникла такая проблема: вот функция : void add(ifstream &fin,LIST *head) {...

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

не находит фаил - C++
фаил с реализацией функций-членов класса, не может найдти фаил с опсанием класса. вот:

Сохранение в фаил - C++
Ребят помогите. В общем есть таблица сделанная структурой, и вот ее надо записать в фаил и прочитать оттуда. Сколько лазил по интернету не...

текстовый фаил - C++
Помогите сделать задачу на С++ я не понимаю этот я зык но надо срочно. В одномерном массиве посчитать сумму элементов,находящихся в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 15:43     Запись в фаил #2
Можно конечно, но блоками по байту. Записывай в файл байт, который формируй из восьми бит.

Добавлено через 45 секунд
Помогут такие операторы, как сдвиг (>>), битовое "и" (&).
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
11.04.2010, 22:39  [ТС]     Запись в фаил #3
Спасибо )

А по подробней можно ? какими функциями пользоваться (запись\чтение) ?
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 23:59     Запись в фаил #4
Запись: fwrite;
Чтение: fread.
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 21:33  [ТС]     Запись в фаил #5
так, вроде бы разобрался.
Теперь возникли дальше вопросы.
допустим у меня есть некая переменная
C++
1
BYTE *cryptedSTR
Вот.я выделяю для неё память(исходя из поста 1)
C++
1
cryptedSTR=new BYTE[144];
Вот.А как мне следует хранить мои получившиеся биты?(144шт)
Как инт?(чтобы легко делать побитовое и\или) или как-то по- другому?
ведь у меня получиться сделать потом
C++
1
2
3
int a;
a=11111;
*scyptedSTR=a*1000;
или не получиться?
ЗЫ я этим действием хочу сделать что-то типа
C++
1
*cryptedSTR=0x11111000
т.е. это равносильно или нет?
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,790
12.04.2010, 22:21     Запись в фаил #6
Цитата Сообщение от GAME Посмотреть сообщение
Вот.А как мне следует хранить мои получившиеся биты?
Допустим у нас есть 4 бита. Мы их хотим "упаковать" в одну переменную.
C++
1
2
3
4
5
6
7
8
int bit[4] = {0, 1, 1, 1};
int n;
 
n = 0;
n<<=1; n+=bit[3];
n<<=1; n+=bit[2];
n<<=1; n+=bit[1];
n<<=1; n+=bit[0];
Теперь n равняется 14 в двоичной записи : 1110
C++
1
n<<=1;  // означает, что содержимое  n  сдвигается на один разряд влево
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
12.04.2010, 23:57  [ТС]     Запись в фаил #7
Спасибо большое.

А насчёт эквивалентности записей
Это одно и тоже
C++
1
2
3
int a;
a=11111;
*scyptedSTR=a*1000;
C++
1
    *cryptedSTR=0x11111000
Добавлено через 1 минуту
судя из моих экспериментов - да)

Добавлено через 1 час 18 минут
Цитата Сообщение от Alex5 Посмотреть сообщение
C++
1
n<<=1;  // означает, что содержимое  n  сдвигается на один разряд влево
блинн,либо я что-то не так делаю...но оно умножаеться на 2 а не сдвигаеться =*(
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:02     Запись в фаил #8
Цитата Сообщение от GAME Посмотреть сообщение
блинн,либо я что-то не так делаю...но оно умножаеться на 2 а не сдвигаеться =*(
Сдвиг влево на один бит эквивалентен умножению на 2.
Цитата Сообщение от GAME Посмотреть сообщение
C++
1
cryptedSTR=new BYTE[144];
BYTE это байт я не бит.
C++
1
2
3
4
const int bitCount  = 144;
const int bitAtByte = 8;
 
cryptedSTR = new BYTE[bitCount / bitAtByte];
Hell Knight
230 / 84 / 3
Регистрация: 11.03.2010
Сообщений: 290
13.04.2010, 00:07     Запись в фаил #9
есть так же такой способ:
WriteFile()
юзай мсдн...
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
13.04.2010, 00:07  [ТС]     Запись в фаил #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сдвиг влево на один бит эквивалентен умножению на 2.

BYTE это байт я не бит.
а
ааа
мда) пора пойти поспать)))
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 00:09     Запись в фаил #11
Цитата Сообщение от Hell Knight Посмотреть сообщение
есть так же такой способ:
WriteFile()
юзай мсдн...
А есть std::ofstream и FILE*, которые работают везде, а не только под Windows.
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,790
13.04.2010, 00:12     Запись в фаил #12
Цитата Сообщение от GAME Посмотреть сообщение
...но оно умножаеться на 2 а не сдвигаеться =*(
C++
1
2
3
4
5
Десятичная система    Двоичная система счисления
   3                                 00000011
   6                                 00000110
  12                                 00001100
  24                                 00011000
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 01:56     Запись в фаил #13
А зачем для 144 бит 144 байта? Достаточно ведь 18 байт. Т.к. 8 бит на байт * 18 байт = 144 бит.
C
1
2
3
4
5
...
#include <stdint.h>
...
uint8_t a[18];
...
Чтобы установить 5ый бит (считая с нуля) 6го байта (считая с нуля) в единицу:
C
1
2
3
...
a[6] |= 1 << 5;
...
Чтобы установить 3ий бит (считая с нуля) 1го байта (считая с нуля) в единицу:
C
1
2
3
...
a[1] |= 1 << 3;
...
Чтобы узнать значение 7го бита 8го байта:
C
1
2
3
...
r = (a[8] & (1 << 7))>> 7;
...
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 02:06     Запись в фаил #14
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы установить 5ый бит (считая с нуля) 6го байта (считая с нуля) в единицу:
C++
1
a[5] |= 0x10;
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы установить 3ий бит (считая с нуля) 1го байта (считая с нуля) в единицу:
C++
1
a[0] |= 0x04;
Цитата Сообщение от kirjushyk Посмотреть сообщение
Чтобы узнать значение 7го бита 8го байта:
C++
1
r = a[7] & 0x40;
Без лишних сдвигов.
kirjushyk, нумерация элементов массива начинается с нуля, поэтому шестой байт это a[5], а не a[6].
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2010, 02:48     Запись в фаил
Еще ссылки по теме:

не открывается фаил - C++
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; #include&lt;iostream&gt; using namespace std; struct...

Дописать фаил - C++
Помогите новичку. Есть фаил: Надо вставить в начало конец строки, которая начинается на RRRC и в конец файла тест. Вот исходник ...

С++ - Считывание из файла в фаил ) - C++
Всем приветь.Парюсь дальше: #include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using...

неправильно передается фаил - C++
функция add не правель работает(как правельно передать фаил?) #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...

Ввод вывод в фаил - C++
Уважаемые эксперты помогите пожалуйста. Мне необходимо написать программу, которая сортирует методом пузырька слова, записанные в отдельном...


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

Или воспользуйтесь поиском по форуму:
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
13.04.2010, 02:48     Запись в фаил #15
Шестой байт считая с нуля (как я между прочим и указал) это как раз a[6]. Или как бы я обращался к нулевому байту (считая с нуля)? А со сдвигами я показал, чтобы понятнее было.
Yandex
Объявления
13.04.2010, 02:48     Запись в фаил
Ответ Создать тему
Опции темы

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