Facebook
From mef, 4 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 200
  1. //pierwsza
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define kropka 46
  5. #define BUFOR 1000
  6. #define MAX_PATH 256
  7. //struktura zawierajaca kod znaku oraz iolos jego wystapien
  8.  
  9. struct element_zrodla {
  10.     int indeks_znaku;
  11.     int ilosc_wystapien;
  12. };
  13. //struktura o rozmiarze 256
  14. struct element_zrodla model[256];
  15.  
  16. //licznik elementów zródla
  17. int  licznik_symboli = 0;
  18.  
  19. //funkcja zmieniajaca nazwe pliku
  20. int stworz_nazwe_pliku(char *nazwa_pliku, char *rozszerzenie, char *nazwa_pliku_z_nowym_rozszerzeniem) {
  21.     int i = 0;  //zmienna pomocnicza
  22.     int n = 0;  //zmienna pomocnicza
  23.     while((nazwa_pliku[n]!= kropka)&&(nazwa_pliku[n]!= '\0'))
  24.         n++;
  25.     for(i = 0; i<n;i++)
  26.         nazwa_pliku_z_nowym_rozszerzeniem[i] = nazwa_pliku[i];
  27.    
  28.         nazwa_pliku_z_nowym_rozszerzeniem[i] = kropka;
  29.     n=0;
  30.     i++;
  31.  
  32.     while(rozszerzenie[n] != '\0'){
  33.         nazwa_pliku_z_nowym_rozszerzeniem[i] = rozszerzenie[n];
  34.         i++;
  35.         n++;
  36.     }
  37.  
  38.     nazwa_pliku_z_nowym_rozszerzeniem[i] = 0;
  39.     return 0;
  40. }
  41.  
  42. int utworz_model_niepelny_Huffman(struct element_zrodla model[], struct element_zrodla model_pelny[256]) {
  43.     int n=0;
  44.     for(int i = 0; i < 256; i++){
  45.         if(model_pelny[i].ilosc_wystapien > 0){
  46.             model[n].indeks_znaku = model_pelny[i].indeks_znaku;
  47.             model[n].ilosc_wystapien = model_pelny[i].ilosc_wystapien;
  48.             n++;
  49.         }
  50.     }
  51.     return n;
  52. }
  53.  
  54. //druga
  55.  
  56. //metoda obliczajaca ilosci wystapien poszczegolnych znakow
  57.  
  58. int policz_symbole(char *nazwa_pliku, char *nazwa_pliku_model, char *nazwa_pliku_wynik, struct element_zrodla model[])
  59. {
  60. int liczba_znakow = 0; //zmienne pomocnicze
  61. int n=0;
  62. unsigned char BUFOR_WEDSCIOWY[BUFOR]; //bufor wykorzystywany przy odczycie danych z pliku
  63. struct element_zrodla model_pelny[256]; //pelny model zrodla
  64. for(int i = 0; i < 256; i++) //petla po pelnym modelu zrodla
  65. {
  66.         model_pelny[i].indeks_znaku = i; // przypisanie kodu znaku
  67.         model_pelny[i].ilosc_wystapien = 0; // ustawienie ilosci wystapien na 0
  68. }
  69.  
  70. FILE *plik; //wskaznik do pliku
  71. plik = fopen(nazwa_pliku, "rb"); //otwarcie pliku w trybie "read-binary"
  72. if (plik == NULL) //jezeli nie udalo sie otworzyc pliku do odczytu
  73.         printf ("Nie udalo sie otworzyc pliku zrodlowego\n");
  74. else //jezeli udalo sie otworzyc plik
  75. {
  76.         printf("Odczytuje plik zrodlowy\n");
  77.         while (n = fread(BUFOR_WEDSCIOWY, sizeof(unsigned char), BUFOR, plik)) //dopoki sa odczytywane znaki pliku
  78.                 {
  79.                         for(int j = 0; j < n; j++) //petla od 0 do n
  80.                         {
  81.                                 model_pelny[BUFOR_WEDSCIOWY[j]].ilosc_wystapien++; //zwiekszenie ilosci wystapien odczytanego znaku z pliku
  82.                         }
  83.                 liczba_znakow += n; //zwiekszenie liczby znakow w pliku
  84.                 }      
  85.         printf("W pliku wejsciowym bylo %d znakow\n", liczba_znakow);
  86.         fclose(plik); //zamkniecie pliku
  87.         plik = fopen(nazwa_pliku_wynik, "wb"); //otwarcie pliku do zapisu binarnego (plik z iloscia znakow)
  88.         if(plik == NULL) //jezeli nie udalo sie otworzyc pliku
  89.         {
  90.                 printf("Nie mozna otworzyc pliku %d", nazwa_pliku_wynik);
  91.                 exit(EXIT_FAILURE);
  92.         }
  93.         else //jezeli udalo sie otworzyc plik
  94.         {
  95.                 fprintf(plik,"%d \n", liczba_znakow); //wypisanie ilosci znakow do pliku
  96.                 fclose(plik); //zamkniecie pliku
  97.         }
  98.         licznik_symboli = utworz_model_niepelny_Huffman(model, model_pelny); //wywolanie metody wyznaczajacej niepelny model Huffmana
  99.         plik = fopen(nazwa_pliku_model, "wb"); //otwarcie pliku do zapisu binarnego
  100.         if(plik == NULL) //jezeli nie udalo sie otworzyc pliku
  101.         {
  102.                 printf ("Nie udalo sie otworzyc pliku %d\n", nazwa_pliku_model);
  103.                 exit(EXIT_FAILURE);
  104.         }
  105.         else //jezeli udalo sie otworzyc plik
  106.         {
  107.                 for(int k = 0; k < licznik_symboli; k++) //petla po ilosci symboli odczytanych z pliku
  108.                         fprintf(plik, "%d %d \n", model[k].indeks_znaku, model[k].ilosc_wystapien); //wypisanie kodu znaku i ilosci wystapien do pliku
  109.                         fclose(plik); //zamkniecie pliku
  110.         }
  111. }
  112. return 0;
  113. }
  114.  
  115. //trzecia
  116.  
  117. //funckja porównująca wartości modelu, wykorzystywana przez quicksort
  118. int funkcja_porownujaca(const void *element1, const void *element2)
  119. {
  120.         const struct element_zrodla *p1=(const struct element_zrodla*) element1;
  121.         const struct element_zrodla *p2=(const struct element_zrodla*) element2;
  122.         if((p1->ilosc_wystapien)==(p2->ilosc_wystapien))
  123.                 return 1;
  124.         else if((p1->ilosc_wystapien)<(p2->ilosc_wystapien))
  125.                 return 1;
  126.         else
  127.                 return -1;
  128. }
  129.  
  130. //funkcja sotrująca model źródła informacji i zapisująca go do pliku
  131. int posortuj_symbole(struct element_zrodla model[], int liczba_elementow, char* plik_model_posortowany)
  132. {
  133.         //wywołanie funkcji sortującej
  134.         qsort(model, liczba_elementow, sizeof(struct element_zrodla), funkcja_porownujaca);
  135.         //wskaźnik na plik
  136.         FILE *plik;
  137.         //otwarcie pliku
  138.         plik=fopen(plik_model_posortowany,"wb");
  139.         //jeżeli nie udało sie otworzyć pliku do zapisu binarnego
  140.         if(plik==NULL)
  141.         {
  142.                 printf("Blad w trakcie otwierania plku do zapisu posortowanego modelu\n");
  143.                 exit(EXIT_FAILURE);
  144.         }
  145.         else
  146.         {
  147.                 //pętla po ilości elementów w źródle informacji
  148.                 for(int i=0; i<liczba_elementow; i++)
  149.                 {
  150.                         //wypisanie numeru znaku i ilości jego wystąpień
  151.                         fprintf(plik, "%d %d \n", model[i].indeks_znaku, model[i].ilosc_wystapien);
  152.                 }
  153.                 //zamkniecie pliku
  154.                 fclose(plik);
  155.         }      
  156. }
  157. int model_zrodla_informacji(char *nazwa_pliku, char *nazwa_pliku_model, char *nazwa_pliku_drzewo, char *nazwa_pliku_sort, struct element_zrodla model[])
  158. {
  159.         policz_symbole(nazwa_pliku, nazwa_pliku_model, nazwa_pliku_drzewo, model);
  160.         posortuj_symbole(model, licznik_symboli, nazwa_pliku_sort);
  161.         return 0;
  162. }
  163.  
  164. //ostatnia
  165. //Glowna funkcja programu
  166.  
  167. int main(int argc, char *argv[])
  168.  
  169. {
  170.  
  171.     int dlugosc_pliku = 0;  
  172.  
  173.     char wybor; //zmienna okreslajaca wybór dokonany przez użytkownika (wpisana wartość w menu)
  174.  
  175.     char nazwa_pliku[MAX_PATH]; //zmienna określająca nazwę pliku do kompresji
  176.  
  177.     char *nazwa_pliku_model; //nazwa pliku dla modelu źródła
  178.  
  179.     char *nazwa_pliku_sort; //nazwa pliku po sortowaniu
  180.  
  181.     char *nazwa_pliku_drzewo; //nazwa pliku z drzewem kodowania
  182.  
  183.     char rozszerzenie_modelu[] = "model"; //rozszerzenie pliku z modelem
  184.  
  185.     char rozszerzenie_sort[] = "sort"; //rozszerzenie modelu po sortowaniu
  186.  
  187.     char rozszerzenie_drzewo[] = "tree"; //rozszerzenie pliku z drzewem kodowania
  188.  
  189.         printf("Teoria Informacji i Kodowania\n");    
  190.  
  191.         printf("Program do kodowania i dekodowania Huffmana\n");
  192.  
  193.         printf("oraz obliczania CRC32\n");
  194.  
  195.         wybor = 1;
  196.  
  197.          
  198.  
  199.         while(wybor == 1 || wybor == 2 || wybor == 3)
  200.  
  201.         {
  202.  
  203.             printf("1. Kompresja Huffmana\n");
  204.  
  205.             printf("2. Dekompresja Huffmana\n");
  206.  
  207.             printf("3. Obliczenie CRC32 dla pliku\n");
  208.  
  209.             printf("4. Wyswietlenie tablicy CRC\n");
  210.  
  211.             printf("Inny znak - wyjscie\n");
  212.  
  213.              
  214.  
  215.             //Wczytanie wyboru użytkownika
  216.  
  217.             scanf("%d", &wybor);
  218.  
  219.             if (wybor == 1)
  220.  
  221.             {
  222.  
  223.                 printf("Podaj nazw pliku do kompresji wraz z rozszerzeniem\n");
  224.  
  225.                 scanf("%s", &nazwa_pliku);
  226.  
  227.                 while ((nazwa_pliku[dlugosc_pliku] != '\0' && nazwa_pliku[dlugosc_pliku] != kropka))
  228.  
  229.                     dlugosc_pliku++; //zwiekszanie zmiennej pomocniczej
  230.  
  231.                  
  232.  
  233.                     //okreslenie dlugosci tablic
  234.  
  235.                     nazwa_pliku_model = (char*)malloc(sizeof(char) * (dlugosc_pliku + 1 + (sizeof(rozszerzenie_modelu) / sizeof(rozszerzenie_modelu[0]))));
  236.  
  237.                     nazwa_pliku_sort = (char*)malloc(sizeof(char) * (dlugosc_pliku + 1 + (sizeof(rozszerzenie_sort) / sizeof(rozszerzenie_sort[0]))));
  238.  
  239.                     nazwa_pliku_drzewo = (char*)malloc(sizeof(char) * (dlugosc_pliku + 1 + (sizeof(rozszerzenie_drzewo) / sizeof(rozszerzenie_drzewo[0]))));
  240.  
  241.                      
  242.  
  243.                     stworz_nazwe_pliku(nazwa_pliku, rozszerzenie_modelu, nazwa_pliku_model);
  244.  
  245.                     printf("Nazwa pliku z modelem:              %s\n", nazwa_pliku_model);
  246.  
  247.                     stworz_nazwe_pliku(nazwa_pliku, rozszerzenie_sort, nazwa_pliku_sort);
  248.  
  249.                     printf("Nazwa pliku z posortowanym modelem:       %s\n", nazwa_pliku_sort);
  250.  
  251.                     stworz_nazwe_pliku(nazwa_pliku, rozszerzenie_drzewo, nazwa_pliku_drzewo);
  252.  
  253.                     printf("Nazwa pliku z drzewem kodowania: %s\n", nazwa_pliku_drzewo);
  254.  
  255.                      
  256.  
  257.                     model_zrodla_informacji(nazwa_pliku, nazwa_pliku_model, nazwa_pliku_drzewo, nazwa_pliku_sort, model);
  258.  
  259.                      
  260.  
  261.                     system("PAUSE");
  262.  
  263.             }
  264.  
  265.         }
  266.  
  267. }