Zadání 4. domácího úkolu – RLE komprese
Napište program, který bude komprimovat a dekomprimovat soubory metodou RLE (Run Length Encoding).
- Metoda komprese RLE je velmi jednoduchá. V principu místo opakování téhož znaku (hodnoty)
uloží znak pouze 1x a počet opakování.
- Popsána je třeba zde
nebo zde.
- Příklady užití i s dalším vysvětlením jsou k dispozici třeba
zde.
- Program bude umět komprimovat více souborů naráz. Výsledek uloží do jednoho společného souboru, ze kterého je bude umět zase dekomprimovat.
- Program se bude ovládat přes parametry na příkazové řádce.
- Prototyp funkce main() může být: int main(int argc, char**argv);
- Příklady programů, které se ovládají obdobně na příkazovém řádku, jsou k dispozici v rámci
záznamu ze
3. dobrovolného cvičení.
- Je zde i k dispozici část řešení tohoto domácího úkolu – programy,
které sbalují a rozbalují soubory do/z jednoho souboru.
Ovládání na příkazovém řádku prakticky odpovídá tomuto úkolu. Programy pouze neprovádí žádnou kompresi.
pack a pack2
- Mechanismus předávání parametrů programům na příkazovém řádku je posán třeba
zde, pro další
odkazy vizte dobrovolné cvičení.
- V rámci tohoto úkolu lze předpokládat, že na vstupu nebude více než 10 souborů a že jejich
názvy nebudou obsahovat bílé znaky.
- V rámci tohoto úkolu netřeba ošetřovat případné chyby, které mohou během IO operací nastat.
- Pozor: oproti programům pack a pack2 kompresní program nezná délku výsledného souboru.
Je proto nutné nějak oddělit jednotlivé soubory nebo si výslednou délku napřed zjistit.
- Lze výsledky uložit do jiných souborů a poté složit.
- Nebo lze také uložit hlavičku na konec souboru, kde v posledním záznamu je uložena pozice jejího začátku.
Takto řeším ve své implementaci.
- Výše uvedené příklady zpracovávají soubory s využitím bufferu. To je efektivnější, avšak implementace RLE je mírně náročnější s využitím bufferu.
Může se například při dekompresi stát, že escape a počet či opakovaný znak jsou umístěny v různých čteních v různých bufferech.- Proto bude uznáno řešení bez bufferu, které soubory kopíruje znak po znaku.
- Možná také využijete ukládání čísel v neformátované podobě, např.:
size_t delka_nazvu_souboru = strlen(argv[i]);
fwrite(&delka_nazvu_souboru, sizeof(size_t), 1, fout);
- Nebuďte zklamáni, kompresní poměr RLE nebývá obecně moc dobrý, hodí se pouze v některých případech. Často je výsledek větší než originál :)
- Program bude testován s výsledkem, který sám vyrobí, formát hlavičky apod. závisí čistě na vás.
Ovládání programu
Komprese
pack_rle -s <vystupni_soubor> <1_vstupni_soubor> ... <n_vstupni_soubor>
Dekomprese
pack_rle -r <vstupni_soubor>
Pozor: Ovládání je třeba dodržet, kdo nedodrží, bude program automaticky vrácen či negativně hodnocen.
Toto nepovažuji za přísné omezení, bo splnění podmínky je triviální, neboť nabízené programy pack a pack2 toto již implementují.
Odevzdání
- Projekt nazvěte "ib001_u4".
- Chcete-li odevzdat jako projekt, zabalte celý adresář ve formátu zip, jinak stačí odevzdat pouze vlastní zdrojový soubor.
- Úkol vložte do ISu dle skupiny, do níž jste přihlášeni:
Příklady běhu:
(zde předváděné řešení zpracovává soubory s mezery v názvu, to není nutno implementovat)
[xbayer@katana-ng:~/skola/ib001/2014/u4/test] ./pack_rle -s zapackovany.pack ctvrty.txt druhy\ s\ mezerou.txt paty.txt prvni.txt sedmy.data sesty.data treti.txt 01.pdf 02.pdf 03.pdf
zapackovavame... ctvrty.txt
zapackovavame... druhy s mezerou.txt
zapackovavame... paty.txt
zapackovavame... prvni.txt
zapackovavame... sedmy.data
zapackovavame... sesty.data
zapackovavame... treti.txt
zapackovavame... 01.pdf
zapackovavame... 02.pdf
zapackovavame... 03.pdf
[xbayer@katana-ng:~/skola/ib001/2014/u4/test] cp zapackovany.pack pack_rle pokus/
[xbayer@katana-ng:~/skola/ib001/2014/u4/test] cd pokus/
[xbayer@katana-ng:~/skola/ib001/2014/u4/test/pokus] ./pack_rle -r zapackovany.pack
depackovavame... ctvrty.txt
depackovavame... druhy s mezerou.txt
depackovavame... paty.txt
depackovavame... prvni.txt
depackovavame... sedmy.data
depackovavame... sesty.data
depackovavame... treti.txt
depackovavame... 01.pdf
depackovavame... 02.pdf
depackovavame... 03.pdf