ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

12.11.2008, 00:34
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме: 4275992
Репутация:
1188
|
|
Сообщение от Lee_fx
Доброго времени суток, появилась такая проблемка c алгоритмом Хаффмана:
Имеется массив содержащий набор двоичныч кодов ( пр. char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}}; ) для букв a, b, c. Как в файле поменять каждую a, b и c на ее двоичный код? Совсем чего-то запутался, ведь нет же переменных, которые хранят двоичный код? А с этим чаром что так 8 байт что так =(
если я тебя правильно понял то те нужно открыть файл и читать посимвольно. если встречается тот символ что нужен то заменить на код..
почему бы не использовать код из 3-х цифр как строку? а сделать поиск по файлу и использовать замену строк (типа как replacestr() )...
|
|
|

12.11.2008, 01:05
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме: 1777055
Репутация:
347
|
|
Сообщение от NetSter
независимо от того какое значение Number получает функция RUN от листбокса диалога (а получает постоянно точно то же что я выбрал в диалоге, я проверял без подключения DLL простым выводом) получаем постоянно в результате НОЛЬ...
...
я уже хз где я мог втыкануть.... может тому кто долго не втыкал этот бред на свежую голову все покажется просто и укажет на траблу..
Заранее спасибо за любой ответ.
ты там написал:
sprintf(s,"%f", res);
но res вообще-то целого типа. Попробуй
sprintf(s,"%d", res);
|
|
|

12.11.2008, 01:07
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Код:
FILE *MyFile, *OUT;
char temp;
Symbols[3] = {'a', 'b', 'c'};
......
MyFile = fopen("1.txt", "r");
OUT = fopen("2.txt", "wb");
while(!feof(MyFile))
{
fread(&temp, 1, sizeof(char), MyFile);
for(i=0; i<3; i++)
if(temp == Symbols[i])
fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT);
}
Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
|
|
|

12.11.2008, 01:28
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме: 1777055
Репутация:
347
|
|
код не весь. Если ты объявлял так:
char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}};
то переменная `a[i]` будет размером в 4 байта. Соответственно fwrite будет записывать немного больше чем ожидалось
Последний раз редактировалось bons; 12.11.2008 в 01:31..
|
|
|

12.11.2008, 08:55
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Сообщение от bons
код не весь. Если ты объявлял так:
char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}};
то переменная `a[i]` будет размером в 4 байта. Соответственно fwrite будет записывать немного больше чем ожидалось
На этот ляп ладно, можно [4][4] сделать, мня интересует как вместо символа размером 8 байт записать двоичный код размером 4?
|
|
|

12.11.2008, 11:11
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме: 1777055
Репутация:
347
|
|
ага, я наконец врубился что ты хочешь.
кстати символ скорее 1 байт чем 8.
программа твоя ..гхм.. замечательна, но работать правильно она будет только если ты изменишь там пару строчек:
Код:
FILE *MyFile, *OUT;
char temp;
Symbols[3] = {'a', 'b', 'c'};
......
MyFile = fopen("1.txt", "r");
OUT = fopen("2.txt", "wb");
while((temp=fgetc(MyFile))!=EOF)
{
for(i=0; i<3; i++)
if(temp == Symbols[i])
fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT);
}
|
|
|

12.11.2008, 13:16
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме: 127017
Репутация:
61
|
|
Сообщение от Lee_fx
Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
Вы не понимаете саму суть битов. Бит - 1/8 часть байта, которая может быть либо 0 либо 1. Отдельный бит записать в файл нельзя. Записать его можно только в виде байта. Соответственно перед записью битов необходимо их паковать в байты, и при накоплении количества битов кратному 8ми, записывать их в выходной файл. Вот накатал небольшое решение для вашего вопроса:
Код:
#include <stdio.h>
void main()
{
FILE *in, *out;
//кодирование 3мя битами
int ar[3] = {0x00, 0x05, 0x07}; //коды 'a', 'b', 'c'
char buf; //тут сидит считанный байт с файла
in = fopen("f1.txt", "rb");
out = fopen("f2.bin", "wb");
int count = 0;
union {
int out_buf;
char b[4];
} data;
data.out_buf = 0;
while(fread(&buf, 1, 1, in))
{
if(count < 8)
{ //не записываем, пока не наберем кратное 8ми
//количество битов
data.out_buf = (data.out_buf<<3) + ar[buf - 'a'];
count++;
}
else
{ //запись битов
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
data.out_buf = ar[buf - 'a'];
count = 1;
}
}
if(count > 0)
{ //запись остатков
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
}
fclose(out);
fclose(in);
}
Вот пример файла для кодирования (f1.txt) 22 байта:
Код:
bacbabcabcbacbabcbacba
После ужатия получили 12 байт, но в конце есть лишние байты, т.к. количество битов не кратно 8ми (22*3 = 66), соответственно в начале файла нужно хранить ещё выходной размер файла, чтобы опустить лишнюю информацию в конце файла, но это уже за рамками поста (пиши в ПМ, если что).
Следует учитывать, что по Хаффману для каждого символа должен быть свой код, т.е. во входном файле все возможные символы должны быть предугаданы тобой, то бишь быть в массиве ar.
|
|
|

12.11.2008, 23:36
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме: 4275992
Репутация:
1188
|
|
кто шарит реализовать звучание звука в MFC приложении..
уже пару постов создавал но так и не получилось..
посоветуйте плиз кто что знает)
смотрите посты ЗДЕСЬ и ЗДЕСЬ
спасибо.
|
|
|

13.11.2008, 00:05
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме: 127017
Репутация:
61
|
|
|
|
|

13.11.2008, 03:29
|
|
Участник форума
Регистрация: 06.05.2008
Сообщений: 161
Провел на форуме: 1289087
Репутация:
59
|
|
Есть код.
Код:
struct list{int elem;
list *next;
list *down;};
int main() {
list *curr, *head;
head = NULL;
curr = NULL;
cin >> stolb;
cin >> strok;
for (int j=0; j<strok; j++){
for(int i=0; i<stolb; i++) {
curr = (list*) new int [strok];
curr->elem = rand()%10+1;
curr->next = head;
head = curr;
}
curr->down = head;
}
return 0;
}
Как можно добавить еще одну строку в конец, без создание еще одной такой же структуры, переноса туда данных, потом переопределение этой и возврата данных+новая строка.
Я уже все перепробовал. Максимум что удалось это добавить строку в начало. А все остальное что я пробовал заставляет вылетать программу с ошибкой при выводе структуры(залезаю где то за границы)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|