Advertisement
Guest User

Untitled

a guest
May 25th, 2015
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. struct lista
  9. {
  10. int symbol;
  11. string kod;
  12. struct lista *prev, *next;
  13. };
  14. typedef struct lista lista;
  15.  
  16. void wstaw(lista **glowa, int symbol, string kod)
  17. {
  18. lista *nowaGlowa = new lista;
  19.  
  20. nowaGlowa->symbol = symbol;
  21. nowaGlowa->kod = kod;
  22. nowaGlowa->next = NULL;
  23.  
  24. if (!*glowa) nowaGlowa->prev = NULL;
  25. else
  26. {
  27. nowaGlowa->prev = *glowa;
  28. (*glowa)->next = nowaGlowa;
  29. }
  30.  
  31. *glowa = nowaGlowa;
  32. }
  33.  
  34. lista *przeszukajListe(lista **glowa, int symbol)
  35. {
  36. lista *tmp = *glowa;
  37. while (tmp != NULL && tmp->symbol != symbol)
  38. tmp = tmp->prev;
  39.  
  40. return tmp;
  41. }
  42.  
  43. string zmienRozszerzenie(string nazwa_pliku_wejsciowego, string noweRozszerzenie)
  44. {
  45. unsigned int znajdzKropke;
  46.  
  47. znajdzKropke = nazwa_pliku_wejsciowego.find_last_of(".");
  48. nazwa_pliku_wejsciowego.replace(znajdzKropke, nazwa_pliku_wejsciowego.length() - znajdzKropke, noweRozszerzenie);
  49.  
  50. return nazwa_pliku_wejsciowego;
  51. }
  52.  
  53. int wczytywanieTablicySlowKodowych(string nazwa_pliku_wejsciowego, ifstream &plik_odczyt, lista** glowa)
  54. {
  55. string tmp;
  56. int s_bajt_8b;
  57. string k_bajt_8b;
  58.  
  59. plik_odczyt.open(nazwa_pliku_wejsciowego.c_str(), ios::in);
  60. if (!plik_odczyt.is_open())
  61. {
  62. cout << "### Blad otwierania pliku odczytywanego w trybie tekstowym!" << endl;
  63. return -1;
  64. }
  65.  
  66. while (true)
  67. {
  68. plik_odczyt >> s_bajt_8b;
  69. plik_odczyt >> k_bajt_8b;
  70.  
  71. if (!plik_odczyt.good()) break;
  72.  
  73. wstaw(glowa, s_bajt_8b, k_bajt_8b);
  74. }
  75.  
  76. plik_odczyt.close();
  77.  
  78. cout << "Tabela slow kodowych zostala wczytana!" << endl;
  79.  
  80. return 0;
  81. }
  82.  
  83. int kompresowaniePliku(string nazwa_pliku_wejsciowego, ifstream &plik_odczyt, ofstream &plik_zapis, lista** glowa)
  84. {
  85. unsigned char bajt_8b;
  86. long zapis_bajt_8b;
  87.  
  88. string nazwa_pliku_huff = zmienRozszerzenie(nazwa_pliku_wejsciowego, ".huff");
  89.  
  90. plik_odczyt.open(nazwa_pliku_wejsciowego.c_str(), ios::binary);
  91. if (!plik_odczyt.is_open())
  92. {
  93. cout << "### Blad otwierania pliku do skompresowania w trybie binarnym!" << endl;
  94. return -1;
  95. }
  96.  
  97. plik_zapis.open(nazwa_pliku_huff.c_str(), ios::binary);
  98. if (!plik_zapis.is_open())
  99. {
  100. cout << "### Blad otwierania pliku do zapisu w trybie binarnym!" << endl;
  101. return -1;
  102. }
  103.  
  104. lista *symbolSzukany = NULL;
  105. string lancuchKodowy = "00000000";
  106.  
  107. zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
  108. plik_zapis.put(zapis_bajt_8b);
  109. lancuchKodowy.clear();
  110.  
  111. while (true)
  112. {
  113. bajt_8b = plik_odczyt.get();
  114. if (!plik_odczyt.good()) break;
  115.  
  116. symbolSzukany = przeszukajListe(glowa, (int)bajt_8b);
  117. lancuchKodowy = lancuchKodowy + symbolSzukany->kod;
  118.  
  119. if (lancuchKodowy.length() >= 8)
  120. {
  121. while (lancuchKodowy.length() >= 8)
  122. {
  123. string tmpString = lancuchKodowy.substr(0,8);
  124. zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
  125. plik_zapis.put(zapis_bajt_8b);
  126. lancuchKodowy.erase(0, 8);
  127. }
  128. }
  129. }
  130.  
  131. if (lancuchKodowy.length() != 0)
  132. {
  133. while (lancuchKodowy.length() >= 8)
  134. {
  135. string tmpString = lancuchKodowy.substr(0, 8);
  136. zapis_bajt_8b = strtol(tmpString.c_str(), NULL, 2);
  137. plik_zapis.put(zapis_bajt_8b);
  138. lancuchKodowy.erase(0, 8);
  139. }
  140.  
  141. char iloscBitowDoDodania = 8 - lancuchKodowy.length();
  142. for (int i = 0; i < iloscBitowDoDodania; i++)
  143. lancuchKodowy = lancuchKodowy + "0";
  144.  
  145. zapis_bajt_8b = strtol(lancuchKodowy.c_str(), NULL, 2);
  146. plik_zapis.put(zapis_bajt_8b);
  147.  
  148. lancuchKodowy.clear();
  149. plik_zapis.seekp(0, ios::beg);
  150. plik_zapis.put((int)iloscBitowDoDodania);
  151. }
  152.  
  153. plik_odczyt.close();
  154. plik_zapis.close();
  155.  
  156. cout << "Plik skompresowany!" << endl;
  157.  
  158. return 0;
  159. }
  160.  
  161. int main(int argc, char* argv[])
  162. {
  163. system("Cls");
  164.  
  165. if (argc != 3)
  166. {
  167. cout << "*** Blad! Zla ilosc parametrow! Wzor: program.exe tabelaKodowa.code PlikDoSkompresowania.exc" << endl;
  168. return -1;
  169. }
  170.  
  171. string nazwa_pliku_wejsciowego;
  172. string nazwa_pliku_do_skompresowania;
  173. ifstream plik_odczyt;
  174. ofstream plik_zapis;
  175.  
  176. int RetCode;
  177. lista* glowa = NULL;
  178.  
  179. nazwa_pliku_wejsciowego = argv[1];
  180. nazwa_pliku_do_skompresowania = argv[2];
  181.  
  182. cout << "----------------------------------------------------------------------" << endl;
  183. cout << "# Kompresowanie pliku: " << nazwa_pliku_do_skompresowania << endl;
  184. cout << "----------------------------------------------------------------------" << endl << endl;
  185.  
  186. cout << "[1] Wczytywanie tabeli kodowej z pliku " << nazwa_pliku_wejsciowego << "..." << endl;
  187. RetCode = wczytywanieTablicySlowKodowych(nazwa_pliku_wejsciowego, plik_odczyt, &glowa);
  188. if (RetCode == -1) return -1;
  189.  
  190. cout << "[2] Kompresowanie pliku " << nazwa_pliku_do_skompresowania << "..." << endl;
  191. RetCode = kompresowaniePliku(nazwa_pliku_do_skompresowania, plik_odczyt, plik_zapis, &glowa);
  192. if (RetCode == -1) return -1;
  193.  
  194. cout << endl;
  195. cout << "----------------------------------------------------------------------" << endl;
  196. cout << "[+] Plik " << nazwa_pliku_do_skompresowania << " skompresowany pomyslnie!" << endl;
  197. cout << "----------------------------------------------------------------------" << endl;
  198. cout << "# Program zakonczy swoje dzialanie." << endl;
  199. cout << "----------------------------------------------------------------------" << endl;
  200. return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement