Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 21st, 2010 | Syntax: C++ | Size: 4.76 KB | Hits: 78 | Expires: Never
Copy text to clipboard
  1. bool compressRLEPlus   ( const char * inFileName, const char * outFileName )
  2. {
  3.     ifstream input;
  4.     input.open(inFileName, ifstream::in);
  5.  
  6.     ofstream output(outFileName, ios::binary | ios::out);
  7.  
  8.  
  9.     if(!input.is_open() || !output.is_open())
  10.         return false;
  11.  
  12.  
  13.     unsigned char c=0,minuly=0, kolikrat=0;
  14.     Pole neopakujici(127);
  15.     bool prvniPruchod=true;
  16.     int pocetprvku=0;
  17.  
  18.     while(true)
  19.     {
  20.         if(!input.eof())
  21.         {
  22.             pocetprvku++;
  23.         c=(unsigned char) input.get();
  24.         if(c==minuly && !prvniPruchod) //pokud se znak opakuje
  25.         {
  26.  
  27.             kolikrat++;
  28.             if(kolikrat>=127) //pokud jsem na max. poctu opakujicich se znaku
  29.             {
  30.                 //cout << "opakuje se: " << (int)kolikrat << "x" << endl;
  31.                 output.put((unsigned char) (kolikrat+128));
  32.                 output.put((unsigned char) minuly);
  33.                 kolikrat=0;
  34.             }
  35.             if((kolikrat>=3) && (neopakujici.pocet!=0))
  36.             {
  37.                 //cout << "pisu pocet: " << neopakujici.pocet << endl;
  38.                 output.put((unsigned char) neopakujici.pocet);
  39.  
  40.                 /*
  41.                 cout << "vypis neopakujiciho pole:" << endl;
  42.                 for(int i=0;i<neopakujici.pocet;i++)
  43.                     cout << (int) neopakujici.pole[i] << endl;
  44.                 */
  45.  
  46.                 for(int i=0;i<neopakujici.pocet;i++)
  47.                     output.put((unsigned char) neopakujici.pole[i]);
  48.                 neopakujici.pocet=0;
  49.             }
  50.         }
  51.         else //pokud se znak neopakuje
  52.         {
  53.             if(prvniPruchod) //osetreni prvniho pruchodu
  54.                 prvniPruchod=false;
  55.             if(kolikrat>=3) //pokud se minuly znak vyskytoval vice nez 3x, komprimuj
  56.             {
  57.                 //cout << "opakuje se: " << (int)kolikrat << "x" << endl;
  58.                 output.put((unsigned char) (kolikrat+128));
  59.                 output.put((unsigned char) minuly);
  60.                 kolikrat=0;
  61.             }
  62.             if(neopakujici.pocet>=127) //pokud je neopakujich jiz 127, vypis
  63.             {
  64.                 //cout << "nasel jsem 127 neopakujicich" << endl;
  65.                 output.put((unsigned char) neopakujici.pocet);
  66.                 for(int i=0;i<neopakujici.pocet;i++)
  67.                     output.put((unsigned char) neopakujici.pole[i]);
  68.                 neopakujici.pocet=0;
  69.             }
  70.             if(kolikrat==2) //pokud se minuly znak vyskytoval 2x, tak ho presun mezi nekomprimovane
  71.             {
  72.                 //cout << "zapisuju do neopakujicich poprve: " << minuly << endl;
  73.                 neopakujici.pole[neopakujici.pocet]=minuly;
  74.                 neopakujici.pocet=neopakujici.pocet + 1;
  75.  
  76.                 if(neopakujici.pocet>=127) //pokud je neopakujich jiz 127, vypis
  77.                 {
  78.                     output.put((unsigned char) neopakujici.pocet);
  79.                     for(int i=0;i<neopakujici.pocet;i++)
  80.                         output.put((unsigned char) neopakujici.pole[i]);
  81.                     neopakujici.pocet=0;
  82.                 }
  83.                 else
  84.                 {
  85.                     //cout << "zapisuju do neopakujicich podruhe: " << minuly << endl;
  86.                     neopakujici.pole[neopakujici.pocet]=minuly;
  87.                     neopakujici.pocet=neopakujici.pocet + 1;
  88.                 }
  89.             }
  90.             if(kolikrat==1) //pokud se minuly znak vyskytoval 1x, tak ho presun mezi nekomprimovane
  91.             {
  92.                 //cout << "zapisuju do neopakujicich jeden: " << minuly << endl;
  93.                 neopakujici.pole[neopakujici.pocet]=minuly;
  94.                 neopakujici.pocet=neopakujici.pocet + 1;
  95.             }
  96.  
  97.             minuly = c; //aktualni uloz jako minuly
  98.             kolikrat=1;
  99.  
  100.         }
  101.         } // if(!input.eof())
  102.         else //finalni vystup toho, co zbylo
  103.         {
  104.             cout << "oef na poctu: " << (int)pocetprvku << endl;
  105.             if(neopakujici.pocet!=0) //pokud mi neco zbylo v bufferu pro neopakujici
  106.             {
  107.                 //cout << "vypisuju co mi zbylo" << endl;
  108.                 output.put((unsigned char)neopakujici.pocet);
  109.                 for(int i=0;i<neopakujici.pocet;i++)
  110.                     output.put((unsigned char) neopakujici.pole[i]);
  111.             }
  112.  
  113.  
  114.             break;
  115.         }
  116.     }
  117.  
  118.     cout << (int)pocetprvku << endl;
  119.  
  120.     input.close();
  121.     output.close();
  122.  
  123.     return true;
  124. }
  125. bool decompressRLEPlus ( const char * inFileName, const char * outFileName )
  126. {
  127.     ifstream input;
  128.     input.open(inFileName, ifstream::in);
  129.     ofstream output(outFileName, ios::binary | ios::out);
  130.  
  131.     if(!input.is_open() || !output.is_open())
  132.         return false;
  133.  
  134.  
  135.  
  136.  
  137.     input.close();
  138.     output.close();
  139.  
  140.     return true;
  141. }