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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Запускать программу с параметрами:
Start -> Run -> "G:\Vlady Documents\Programs\CBlock\console_c\console.exe" text.txt text2.txt code
(замени на свои данные. Все, что НЕ в кавычках - это параметры)

В программе должны анализироваться параметры командной строки... Что-то типа:
int main(int argc, char *argv[]) {

if(argc < 3) { /* Проверяем количество параметров */
printf("Usage: prog.exe infile outfile code/decode\n");
return 1;
}
char infile[128], outfile[128];
strcpy(infile, argv[1]); /* Первый - имя входного файла */
strcpy(outfile, argv[2]); /* Второй - имя выходного файла */

/* Ну, а третий - если не "code", значит ДЕкодирование */

/* В зависимости от третьего параметра вызываешь либо одну процедуру либо другую */
if(!strcmp(argv[3], "code")) {
printf("coding from '%s' to '%s'\n", infile, outfile);
}
else {
printf("decoding from '%s' to '%s'\n", infile, outfile);
}
getch();
}
 К началу страницы 
+ Ответить 

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


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

 





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