Run Length Encoding

Publicado por Jordano R Reis 17/05/2005

[ Hits: 10.766 ]

Download compact.cpp




Simples Exemplo da utilizacao do metodo de Compressao RLE (Run Length Encoding.) O metodo consiste em agrupar sequencias repetidas de caracteres.
Por Exemplo:

AAAAAAAAABBBBBBBBBBBBBBB
Seria expresso no formato:   @9A@15B

  



Esconder código-fonte

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

void zipar(fstream &arq){
     char zipado[50];
     cout <<"\n\tDigite O nome do arquivo de saida:\t";
     cin >> zipado ;
     ofstream zip(zipado,ios::out | ios::binary);
     char anterior = (char)arq.get();                  //le oprimeiro caracter
     int cont = 1;                                      //inicia o contador pois ja foi lido um caracter
     while(arq)                                          //enquanto conseguir ler o arquivo( not eof)
     {
         char letra = (char)arq.get();                 //a variavel letra recebe o segundo caracter             
         if(letra == anterior)                         // compara os caracteres lidos
             cont++;                                   //se forem iguais acresse o contador
         else
         {
             if(cont > 1)                              //se forem diferentes deve-se colocar no arq de saida
             {                                         //o marcador
                     zip.put('@');
                     zip.write(( char* )&cont, sizeof(int)); // escreve no arquivo o valor contido no contador
             }                                                //que representa o quanto o caracter lido esta repetido
             zip.put(anterior); //escreve o caracer 
             anterior = letra;  // altera a variavel para o proximo caracter lido
             cont = 1; //retorna o contador para 01 pois apenas um caracter foi lido
        }
    }
    cout <<"\n\n\nºººººººººººFim da Compressao...ººººººººººººººº\n";
}

void deszipar(fstream &arq) /* esta rotina ainda nao foi implementada */
{
     char saida[50];
     cout <<"\n\tDigite O nome do arquivo de saida:\t";
     cin >> saida ;
     fstream zip(saida,ios::out | ios::in | ios::binary);
     int numero;
     char letra = (char)arq.get();
     int cont = 1;
     while(arq)
     {
         if(letra == '@')
         {
             arq.read((char *)&numero, sizeof(int));//(int)arq.get();
             letra = (char)arq.get();
             for(int i=0; i < numero; i++)
             {
                 zip.put(letra);
             }
         }
         else
         {
             zip.put(letra);
         }
         letra = (char)arq.get();
    }
    cout <<"\n\n\nºººººººººººDescompactacao OK!...ººººººººººººººº\n";
}
void sobre(){
     system("cls");
     cout <<"\n\tSimples Exemplo da utilizacao do metodo";
     cout <<"\n\tde Compressao RLE (Run Length Encoding.)";
     cout <<"\n";
     cout <<"\n\tO metodo consiste em agrupar sequencias";
     cout <<"\n\trepetidas de caracteres.";
     cout <<"\n\tPor Exemplo:";
     cout <<"\n\tAAAAAAAAABBBBBBBBBBBBBBB";
     cout <<"\n\tSeria expresso no formato";
     cout <<"\n\t@9A@15B";

}
void menu()
{
     system("cls");
     cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::";
     cout <<"\n\t:::::::::::::::MENU DE OPCOES:::::::::::::::::::::";     
     cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::";          
     cout <<"\n\t::\t\t\t\t\t\t::\n\t::  1 - COMPACTAR UM ARQUIVO.\t\t\t::";     
     cout <<"\n\t::\t\t\t\t\t\t::";
     cout <<"\n\t::  2 - DESCOMPACTAR UM ARQUIVO.\t\t::";     
     cout <<"\n\t::\t\t\t\t\t\t::";
     cout <<"\n\t::  3 - AJUDA - DESCRICAO DO PROGRAMA.\t\t::";     
     cout <<"\n\t::\t\t\t\t\t\t::";
     cout <<"\n\t::  4 - SAIR\t\t\t\t\t::\n\t::\t\t\t\t\t\t::";
     cout <<"\n\t::\t\t ESCOLHA UMA OPCAO\t\t::";
     cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::\n\t";     
}

int main()
{
    char nome[50];
    char nomearq[50],sai = 'n';
    int opc;
    while(sai == 'n' || sai == 'N' )
    {
           menu();
           cin >> opc;
           switch(opc)
           {
                      case 1:
                           {
                           cout <<"\tCompactar Um Arquvo....\n";
                           cout <<"\n\tDigite O nome do arquivo para compactar:\t";
                           cin >> nomearq ;
                           fstream dado(nomearq,ios::in | ios::out | ios::binary);
//                           system("pause");
                           if(!dado.is_open())
                           {
                                    cout <<"\n\tERRO! Nao Foi Possivel Abrir O Arquivo!\n";
                                    getchar();
                           }
                           else
                               zipar(dado);
                               getchar();
                           }
                      break;

                      case 2:
                           {
                           cout <<"\tDesompactar Um Arquvo....\n";
                           cout <<"\n\tDigite O nome do arquivo para descompactar:\t";
                           cin >> nomearq ;
                           fstream dado(nomearq,ios::in | ios::out | ios::binary);
                           if(!dado)
                           {
                                    cout <<"\n\tERRO! Nao Foi Possivel Abrir O Arquivo!\n";
                                    getchar();
                           }
                           else
                               deszipar(dado);
                               getchar();
                           }

                      break;

                      case 3:
                           sobre();
                      break;

                      case 4:
                           exit(0);
                      break;
               default:
                   printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");      
           }
           cout << "\n\tDESEJA SAIR DO PROGRAMA? - (S / N)\t";
           cin >> sai;
    }
}

Scripts recomendados

Duplamente Circular

Lista Duplamente

merge sort

Controle de tráfego aéreo - filas dinâmicas

Pilha


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts