Run Length Encoding
Publicado por Jordano R Reis 17/05/2005
[ Hits: 10.766 ]
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
#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; } }
Controle de tráfego aéreo - filas dinâmicas
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta