Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- struct lista
- {
- int symbol;
- string kod;
- struct lista *prev, *next;
- };
- typedef struct lista lista;
- void wstaw(lista **glowa, int symbol, string kod)
- {
- lista *nowaGlowa = new lista;
- nowaGlowa->symbol = symbol;
- nowaGlowa->kod = kod;
- nowaGlowa->next = NULL;
- if (!*glowa) nowaGlowa->prev = NULL;
- else
- {
- nowaGlowa->prev = *glowa;
- (*glowa)->next = nowaGlowa;
- }
- *glowa = nowaGlowa;
- }
- lista *przeszukajListe(lista **glowa, int symbol)
- {
- lista *tmp = *glowa;
- while (tmp != NULL && tmp->symbol != symbol)
- tmp = tmp->prev;
- return tmp;
- }
- string zmienRozszerzenie(string nazwa_pliku_wejsciowego, string noweRozszerzenie)
- {
- unsigned int znajdzKropke;
- znajdzKropke = nazwa_pliku_wejsciowego.find_last_of(".");
- nazwa_pliku_wejsciowego.replace(znajdzKropke, nazwa_pliku_wejsciowego.length() - znajdzKropke, noweRozszerzenie);
- return nazwa_pliku_wejsciowego;
- }
- int wczytywanieTablicySlowKodowych(string nazwa_pliku_wejsciowego, ifstream &plik_odczyt, lista** glowa)
- {
- string tmp;
- int s_bajt_8b;
- string k_bajt_8b;
- plik_odczyt.open(nazwa_pliku_wejsciowego.c_str(), ios::in);
- if (!plik_odczyt.is_open())
- {
- cout << "### Blad otwierania pliku odczytywanego w trybie tekstowym!" << endl;
- return -1;
- }
- while (true)
- {
- plik_odczyt >> s_bajt_8b;
- plik_odczyt >> k_bajt_8b;
- if (!plik_odczyt.good()) break;
- wstaw(glowa, s_bajt_8b, k_bajt_8b);
- }
- plik_odczyt.close();
- cout << "Tabela slow kodowych zostala wczytana!" << endl;
- return 0;
- }
- int kompresowaniePliku(string nazwa_pliku_wejsciowego, ifstream &plik_odczyt, ofstream &plik_zapis, lista** glowa)
- {
- unsigned char bajt_8b;
- long zapis_bajt_8b;
- string nazwa_pliku_huff = zmienRozszerzenie(nazwa_pliku_wejsciowego, ".huff");
- plik_odczyt.open(nazwa_pliku_wejsciowego.c_str(), ios::binary);
- if (!plik_odczyt.is_open())
- {
- cout << "### Blad otwierania pliku do skompresowania w trybie binarnym!" << endl;
- return -1;
- }
- plik_zapis.open(nazwa_pliku_huff.c_str(), ios::binary);
- if (!plik_zapis.is_open())
- {
- cout << "### Blad otwierania pliku do zapisu w trybie binarnym!" << endl;
- return -1;
- }
- lista *symbolSzukany = NULL;
- string lancuchKodowy = "00000000";
- zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
- plik_zapis.put(zapis_bajt_8b);
- lancuchKodowy.clear();
- while (true)
- {
- bajt_8b = plik_odczyt.get();
- if (!plik_odczyt.good()) break;
- symbolSzukany = przeszukajListe(glowa, (int)bajt_8b);
- lancuchKodowy = lancuchKodowy + symbolSzukany->kod;
- if (lancuchKodowy.length() >= 8)
- {
- while (lancuchKodowy.length() >= 8)
- {
- string tmpString = lancuchKodowy.substr(0,8);
- zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
- plik_zapis.put(zapis_bajt_8b);
- lancuchKodowy.erase(0, 8);
- }
- }
- }
- if (lancuchKodowy.length() != 0)
- {
- while (lancuchKodowy.length() >= 8)
- {
- string tmpString = lancuchKodowy.substr(0, 8);
- zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
- plik_zapis.put(zapis_bajt_8b);
- lancuchKodowy.erase(0, 8);
- }
- char iloscBitowDoDodania = 8 - lancuchKodowy.length();
- for (int i = 0; i < iloscBitowDoDodania; i++)
- lancuchKodowy = lancuchKodowy + "0";
- zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
- plik_zapis.put(zapis_bajt_8b);
- lancuchKodowy.clear();
- plik_zapis.seekp(0, ios::beg);
- plik_zapis.put((int)iloscBitowDoDodania);
- }
- plik_odczyt.close();
- plik_zapis.close();
- cout << "Plik skompresowany!" << endl;
- return 0;
- }
- int main(int argc, char* argv[])
- {
- system("Cls");
- if (argc != 3)
- {
- cout << "*** Blad! Zla ilosc parametrow! Wzor: program.exe tabelaKodowa.code PlikDoSkompresowania.exc" << endl;
- return -1;
- }
- string nazwa_pliku_wejsciowego;
- string nazwa_pliku_do_skompresowania;
- ifstream plik_odczyt;
- ofstream plik_zapis;
- int RetCode;
- lista* glowa = NULL;
- nazwa_pliku_wejsciowego = argv[1];
- nazwa_pliku_do_skompresowania = argv[2];
- cout << "----------------------------------------------------------------------" << endl;
- cout << "# Kompresowanie pliku: " << nazwa_pliku_do_skompresowania << endl;
- cout << "----------------------------------------------------------------------" << endl << endl;
- cout << "[1] Wczytywanie tabeli kodowej z pliku " << nazwa_pliku_wejsciowego << "..." << endl;
- RetCode = wczytywanieTablicySlowKodowych(nazwa_pliku_wejsciowego, plik_odczyt, &glowa);
- if (RetCode == -1) return -1;
- cout << "[2] Kompresowanie pliku " << nazwa_pliku_do_skompresowania << "..." << endl;
- RetCode = kompresowaniePliku(nazwa_pliku_do_skompresowania, plik_odczyt, plik_zapis, &glowa);
- if (RetCode == -1) return -1;
- cout << endl;
- cout << "----------------------------------------------------------------------" << endl;
- cout << "[+] Plik " << nazwa_pliku_do_skompresowania << " skompresowany pomyslnie!" << endl;
- cout << "----------------------------------------------------------------------" << endl;
- cout << "# Program zakonczy swoje dzialanie." << endl;
- cout << "----------------------------------------------------------------------" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement