IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Сжатие и распаковка файлов, Си
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Требуется разработать программу для сжатия и распаковки файлов. Для кодирования используется алгоритм Шеннона-Фано. Собственно, проблем с кодированием нет. Вопрос у меня относительно сжатия. Как от меня требуется, сообщение из исходного(входного файла) файла я должна записать в выходной файл (он по заданию двоичный), предварительно закодировав. Для сжатия требуется побайтовый вывод в файл..т.е. у нас есть схема кодирования..считываем очерёдный символ из входного сообщения..ищем для него код...нашли - готовы записывать..но здесь побайтовый вывод. Мы должны сначала набрать 8 бит ,и только потом выводить (но вот код найденный может занимать меньше 8 бит..может больше - у меня с предусмотрением этого проблема)

typedef struct structure {unsigned char id; int count; char code[10];} STRUCTURE;

id - поле для символа
count - число вхождений символа
code[10] - сам код

mas - массив структур

перед выводом в выходной файл массив структур упорядочен по убыванию (убыванию поля count)
как вспомогательный используется массив char mas_code[255][10] (массив содержит в нулевом столбце количество вхождений символа, в остальных коды из 0 и 1)

а вот что делать с этим самым побайтовым выводом - не получается.....

как бы попытки есть...но записывается несовсем правильно не совсем правильно...


int get_byte(char mas_code[255][10],STRUCTURE *mas)
{ unsigned char mask;
mask=0x00;
FILE *f, *g;
char str[60];
int pos_m=8; // pos_m - свободные места в маске
int pos_c, st=0; // pos_c - очерёдное место в коде некоторого символа
f=fopen("1.txt", "r+t");
g=fopen("2.txt", "w");
char x;
while(!feof(f))
{ if (pos_m) { x=fgetc(f);
st=0;
while ( mas[st].id!=x)
st++;
pos_c=1;
while ((pos_m)&&(pos_c<=mas_code[st][0]))
{ mask=mask<<1;
mask|=mas_code[st][pos_c];
pos_m--;
pos_c++;

}
}
else {fprintf(g,"%0x", mask);
itoa(mask,str,2);
printf("%s", str);
printf(" ");
mask=0x00;
pos_m=8;
if (pos_c<=mas_code[st][0])
{ while ((pos_m)&&(pos_c<=mas_code[st][0]))
{ mask<<1;
mask=mask|mas_code[st][pos_c];
pos_m--;
pos_c++;

}



}

}
}
fclose(f);
fclose(g);
return 8-pos_m; // возвращаем кол-во бит, задействованных в последнем байте - нужно по заданию
}




Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 19:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name