Napisać program w języku C++ dokonujący kompresji bezstratnej poprzez zastosowanie kodowania
metodą Huffmana dla dowolnego pliku na podstawie wyznaczonej wcześniej tabeli kodowej dla
tego pliku.
W tym celu należy z określonego pliku wejściowego wczytać do odpowiednio utworzonej tablicy
tabelę kodową, a następnie odczytując poszczególne symbole (bajty 8-bitowe) z zadanego pliku
wejściowego do kompresji zakodować je zgodnie z tabelą kodową i po zakodowaniu zapisać je we
właściwy sposób w pliku wynikowym.
Szczegółowe wymagania stałe:
program ma się poprawnie kompilować w środowisku Dev-C++ w wersji dostępnej w sali
laboratoryjnej, w której prowadzone są zajęcia;
cały program ma mieścić się w jednej jednostce kompilacyjnej (jednym pliku *.cpp);
program ma być uruchamiany z okna konsoli tekstowej, bez interfejsu graficznego;
program ma rozpocząć i zakończyć swoje działanie bez potrzeby dodatkowych działań ze
strony użytkownika (poza jego uruchomieniem); w szczególności bez oczekiwania na
wciśnięcie dowolnego klawisza przez użytkownika;
program ma informować na bieżąco użytkownika o wykonywanych operacjach w postaci
informacji tekstowych wyświetlanych w oknie konsoli tekstowej;
do obsługi wejścia/wyjścia i obsługi plików używać tylko strumieni, a do wszelkich łańcuchów
znaków (tekstu) używać tylko typu string.
Szczegółowe wymagania dotyczące zadania:
nazwa pliku wejściowego zawierającego tabelę kodową z rozszerzeniem *.code ma być
podawana jako pierwszy parametr wejściowy przed uruchomieniem programu, plik
wejściowy ma znajdować się w bieżącym katalogu roboczym;
nazwa dowolnego pliku wejściowego do kompresji ma być podawana jako drugi parametr
wejściowy przed uruchomieniem programu, plik wejściowy do kompresji ma znajdować się
w bieżącym katalogu roboczym;
w wyniku działania programu w pliku wynikowym o nazwie takiej jak nazwa pliku wejściowego
do kompresji lub innej dowolnej, ale w każdym przypadku z rozszerzeniem *.huff mają być
zapisane dane po kompresji zakodowane zgodnie z wczytaną tabelą kodową;
w celu sprawdzania długości łańcuchów znaków kodujących z „0” i „1” (typu string) można
zastosować funkcję length();
w celu odpowiedniego dzielenia łańcucha znaków kodujących z „0” i „1” (typu string) na
krótsze sekwencje można zastosować funkcję substr();
w celu usuwania wybranych znaków z łańcucha znaków kodujących z „0” i „1” (typu string)
można zastosować funkcję erase();
w celu zamiany ośmioznakowych łańcuchów znaków kodujących z „0” i „1” na ich
reprezentację binarną można zastosować funkcję strtol();
po zapisaniu wszystkich zakodowanych danych w pliku wynikowym na samym początku
tego pliku (trzeba wcześniej przewidzieć na to miejsce w pierwszym bajcie pliku wpisując
na samym początku np. wartość 0) lub na samym końcu tego pliku ma zostać zapisana
informacja ile bitów jest ważnych w ostatnim bajcie danych zakodowanych;
w programie poza funkcją main() mają być oddzielne funkcje z przekazywanymi do nich
odpowiednimi argumentami co najmniej dla operacji wczytywania tabeli kodowej i kompresji.
W wersji podstawowej jako wszelkie tablice należy odpowiednio zastosować typ danych tablica
statyczna.