Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Edultra

[Código] Compactador de Arquivos

Recommended Posts

Bem pessoal mais um trabalhinho que tive que fazer na faculdade, bem foi algo para testar o modo de leitura de arquivos e manipulação utilizando vetores, vamos explicar um pouco sobre o que se trata o Compactador de Arquivos:

 

JUSTIFICATIVA

A compressão de dados é muito utilizada no meio digital, principalmente em se tratando de aplicações

multimídia. O que torna um arquivo de música de mais de 40MB reduzido a 10% deste tamanho? Como é

possível armazenar mais de 8 horas de vídeo em um disco de 17GB? Isso tudo deve-se à compressão

digital. Graças a ela encontramos os famosos formatos de arquivo JPG, MP3, MPEG, DivX, sem os quais

antes era praticamente impossível a transmissão multimídia via Internet ou outro meio de comunicação

digital.

OBJETIVOS

O objetivo geral deste trabalho é aproximar o aluno de Programação de um segmento de grande atuação

em sua profissão – a compressão de sinais – para que possa colocar em prática o conhecimento

adquirido em sala de aula.

Os objetivos específicos:

- Uso de vetores

- Uso de arquivos

- Manipulação de strings

- Uso de funções

O PROBLEMA

Para solução integral do trabalho, o aluno deverá seguir algumas premissas:

Criação de variáveis globais:

arqorigem – arquivo de origem

arqdestino – arquivo de destino

vet – vetor auxiliar para compressão/descompressão

Criação das funções:

main()

A função principal irá solicitar os nomes de arquivo de origem e destino.

O usuário irá escolher se o processo é de compressão ou descompressão.

O usuário deverá ter a opção de mostrar o conteúdo do arquivo de origem ou destino. Esta opção é

passada como parâmetro para a função mostraarquivo().

learquivo(...)

Esta função irá fazer a leitura do arquivo de origem e armazená-lo em um vetor. A função learquivo será

utilizada tanto para compressão quanto para descompressão.

comprime(...)

Esta função irá aplicar dois algoritmos de compressão: Huffmann e Run-Length (RLE). À medida em que

os dados vão sendo lidos do vetor e comprimidos, estes são gravados no arquivo de destino.

descomprime(...)

Esta função irá aplicar a descompressão utilizando os dois algoritmos: Huffmann e Run-Length (RLE). À

medida em que os dados vão sendo lidos do vetor e descomprimidos, estes são gravados no arquivo de

destino.

mostraarquivo(op)

Esta função irá apresentar o conteúdo do arquivo escolhido conforme o parâmetro op: ‘O’ para Origem e

‘D’ para Destino.

OS ALGORITMOS

Run-Length (RLE)

O algoritmo RLE utiliza-se da repetição de um mesmo caractere para compressão. Por exemplo:

A seqüência de caracteres:

“AAAAAABCDEFFFFGHIJJJJJJJJJJKLMNOPQQQQQQQQQQQQQRSTUVWXYYYYYYZZZZ”

Seria representada da seguinte maneira:

“A6BCDEF4GHIJ10KLMNOPQ13RSTUVWXY6Z4”

Pois eu informo a letra e em seguida o número de vezes que ela é repetida. Esta técnica é mais utilizada

na compressão de imagens e vídeo.

Como fazer para comprimir dados numéricos?

Huffmann

O algoritmo de Huffmann baseia-se no uso de “apelidos” para seqüência de caracteres mais freqüentes.

Aqui será utilizada uma versão simplificada do algoritmo.

Por exemplo: ao ler um arquivo de texto, vou apelidar a seqüência “ão” de “|”.

Aplicando-se este apelido à seguinte frase:

“A função de compressão é muito útil para transmissão de dados: comunicação digital”

Obtemos o seguinte resultado:

“A funç| de compress| é muito útil para transmiss| de dados: comunicaç| digital”

Desta maneira eu consegui suprimir 4 (quatro) caracteres (bytes) do meu arquivo, tornando-o menor.

Para descomprimir, basta substituir novamente o apelido “|” por “ão”.

Para este trabalho, utilize 10 apelidos para 10 seqüências diferentes (de livre escolha).

Permita cadastrar mais apelidos para ganhar nota extra.

O Código:

 

/*******************************************************************************
Sistema Para compactacao de arquivos utilizando os metodos hufmann e Runlenght

Analista - Eduardo de Souza

Desenvolvedor - Eduardo de Souza

Data Desenvolvimento: 06/11/2008 23:00

Data última Alteração: DD/MM/AAAA HH:MM

Entregue protocolo 11

*******************************************************************************/

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
using namespace std;
void learquivo(char *vet,char arqorigem[20])
{
	fstream arqB;
	arqB.open(arqorigem,ios::in);
	char n[70];
	int i=0;
	while(!arqB.eof())
	{
		arqB.read(n,1);
		n[1]=0;
		if(!arqB.eof())
		{
			vet[i]=n[0];
			i++;
		}
	}
	vet[i]=0;
	cout.flush();
	arqB.close();
		 
}
void comprime(char *vet, int tam)
{
	int i;
	
	for(i=0;i<tam;i++)
	{ 

		if(vet[i]==vet[i+1]&&vet[i]==vet[i+2])
		{
		   int j,q,t;
		   j=i+2;
		   q=2;
		   t=0;
		   vet[i+1]='¬';
		   while(vet[i]==vet[j]&&t!=10)
		   {
			   vet[j]='¬';
			   j++;
			   if(q<10)
			   {
					q++;
			   }
			   if(q>=10&&t<10)
			   {   
					t++;
			   }
		   }
		   if(q<10)
		   {
			   if(q==3)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==4)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==5)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==6)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==7)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==8)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }
			   if(q==9)
			   {
				 vet[i+1]='©';
				 vet[i+2]=q+48;
				 }	 
		   }
		   else if(q>=10&&q<100)
		   {
			   vet[i+1]='æ';
			   vet[i+2]=t+47; 
		   }
		   i+=t+q-1;
		}
		else if(vet[i]=='a'&&vet[i+1]=='s')//as
		   {
			  vet[i]='¦';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='e'&&vet[i+1]=='s')//es
		   {
			 vet[i]='¨';
			 vet[i+1]='¬';
			 
		   }
		else if(vet[i]=='o'&&vet[i+1]=='s')//os
		   {
			  vet[i]='®';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='u'&&vet[i+1]=='s')//us
		   {
			  vet[i]='«';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='ã'&&vet[i+1]=='o')//ão
		   {
			  vet[i]='Ä';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='e'&&vet[i+1]=='m')//em
		   {
			  vet[i]='~';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='n'&&vet[i+1]=='o')//no
		   {
			  vet[i]='^';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='n'&&vet[i+1]=='a')//na
		   {
			  vet[i]='¿';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='a'&&vet[i+1]=='m')//am
		   {
			  vet[i]='´';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='p'&&vet[i+1]=='a')//pa
		   {
			  vet[i]='_';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='r'&&vet[i+1]=='a')//ra
		   {
			  vet[i]='ª';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='d'&&vet[i+1]=='a')//da
		   {
			  vet[i]='ƒ';
			  vet[i+1]='¬';
			  
		   }
		else if(vet[i]=='d'&&vet[i+1]=='e')//de
		   {
			  vet[i]='`';
			  vet[i+1]='¬';
			  
		   }
		   else if(vet[i]=='d'&&vet[i+1]=='o')//do
		   {
			  vet[i]='§';
			  vet[i+1]='¬';
			  
		   }
		   else if(vet[i]=='q'&&vet[i+1]=='u'&&vet[i+2]=='e')//que
		   {
			  vet[i]='1';
			  vet[i+1]='a';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='m'&&vet[i+1]=='e'&&vet[i+2]=='n')//men
		   {
			  vet[i]='1';
			  vet[i+1]='b';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='c'&&vet[i+1]=='o'&&vet[i+2]=='m')//com
		   {
			  vet[i]='1';
			  vet[i+1]='c';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='i'&&vet[i+1]=='n'&&vet[i+2]=='f')//inf
		   {
			  vet[i]='1';
			  vet[i+1]='d';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='p'&&vet[i+1]=='o'&&vet[i+2]=='r')//por
		   {
			  vet[i]='1';
			  vet[i+1]='e';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='c'&&vet[i+1]=='a'&&vet[i+2]=='n')//can
		   {
			  vet[i]='1';
			  vet[i+1]='f';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]==' '&&vet[i+1]=='o'&&vet[i+2]=='u')// o 
		   {
			  vet[i]='1';
			  vet[i+1]='g';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]=='u'&&vet[i+1]=='m'&&vet[i+2]=='a')//uma
		   {
			  vet[i]='1';
			  vet[i+1]='h';
			  vet[i+2]='¬';
			  
		   }
		   else if(vet[i]==' '&&vet[i+1]=='e'&&vet[i+2]==' ')// e 
		   {
			  vet[i]='&';
			  vet[i+1]='¿';
			  vet[i+2]='¬';
		   }
		   else if(vet[i]==' '&&vet[i+1]=='a'&&vet[i+2]==' ')// a 
		   {
			  vet[i]='&';
			  vet[i+1]='-';
			  vet[i+2]='¬';
		   }

	}
	
	
	cout<<"\nConversão Concluida\n";
}
int calculavetB(char *vet,int tam)
{
	int i,tamanhob=0;
		
	for(i=0;i<tam;i++)
	{

		if(vet[i+1]=='©')
			   {
				 tamanhob+=vet[i+2]-48;
			   }
		else if(vet[i+1]=='æ')
		   {
			   tamanhob+=10;
			   tamanhob+=vet[i+2]-48;
		   }
		else if(vet[i]=='¦')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='¨')
		   {
			 tamanhob+=2;
		   }
		else if(vet[i]=='®')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='«')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='Ä')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='~')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='^')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='¿')
		   {
			  tamanhob+=2;
		   }
		else if(vet[i]=='´')
		   {
			  tamanhob+=2;			  
		   }
		else if(vet[i]=='_')
		   {
			  tamanhob+=2;			  
		   }
		else if(vet[i]=='ª')
		   {
			  tamanhob+=2;			  
		   }
		else if(vet[i]=='ƒ')
		   {
			  tamanhob+=2;
			  
		   }
		else if(vet[i]=='`')
		   {
			  tamanhob+=2;
			  
		   }
		else if(vet[i]=='§')
		   {
			  tamanhob+=2;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='a')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='b')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='c')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='d')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='e')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='f')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='g')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='1'&&vet[i+1]=='h')
		   {
			  tamanhob+=3;
			  i++;
			  
		   }
		else if(vet[i]=='&'&&vet[i+1]=='¿')
		   {
			  tamanhob+=3;
			  i++;			  
		   }
		else if(vet[i]=='&'&&vet[i+1]=='-')
		   {
			  tamanhob+=3;
			  i++;			  
		   }
		else
		   tamanhob++;
	}
return tamanhob;
}
void armazena(char *vet, int tam,char arqdestino[20])
{
	int i=0,k;
	k=(tam/100)*3;
	
	ofstream arq;
	arq.open(arqdestino, ios::out);
	for(int i=0; i<tam; i++)
	{
		if(vet[i]!='¬')
		arq << vet[i];
		if(i==k||i==k*1||i==k*2||i==k*3||i==k*4||i==k*5||i==k*6||i==k*7||i==k*8||i==k*9
||i==k*10)
		   printf("%c",178);
	}
arq.close();
}
void converte(char *vet, char *vetdesc, int tam)
{
	 int i,j=0,l,k,cont;
	 for(i=0;i<tam;i++)
	{
		cont=0;
		if(vet[i+1]=='©')
		   {
			  cont=vet[i+2]-48;
			  cont+=-1;
			  vet[i+1]='¬';
			  vet[i+2]='¬';
			  while(cont>0)
			  {
				  vetdesc[j]=vet[i];
				  j++;
				  cont--;
			  }
			  
		   }
		else if(vet[i+1]=='æ')
		   {
			  cont=vet[i+2]-48;
			  vet[i+1]='¬';
			  vet[i+2]='¬';
			  cont+=9;
			  while(cont>0)
			  {
				  vetdesc[j]=vet[i];
				  j++;
				  cont--;
			  }
			  
		   }	
		if(vet[i]=='¦')
		   {
			  vetdesc[j]='a';
			  vetdesc[j+1]='s';
			  j+=2;
		   }
		else if(vet[i]=='¨')
		   {
			  vetdesc[j]='e';
			  vetdesc[j+1]='s';
			  j+=2;
		   }
		else if(vet[i]=='®')
		   {
			  vetdesc[j]='o';
			  vetdesc[j+1]='s';
			  j+=2;
		   }
		else if(vet[i]=='«')
		   {
			  vetdesc[j]='u';
			  vetdesc[j+1]='s';
			  j+=2;
		   }
		else if(vet[i]=='Ä')
		   {
			  vetdesc[j]='ã';
			  vetdesc[j+1]='o';
			  j+=2;
		   }
		else if(vet[i]=='~')
		   {
			  vetdesc[j]='e';
			  vetdesc[j+1]='m';
			  j+=2;
		   }
		else if(vet[i]=='^')
		   {
			  vetdesc[j]='n';
			  vetdesc[j+1]='o';
			  j+=2;
		   }
		else if(vet[i]=='¿')
		   {
			  vetdesc[j]='n';
			  vetdesc[j+1]='a';
			  j+=2;
		   }
		else if(vet[i]=='´')
		   {
			  vetdesc[j]='a';
			  vetdesc[j+1]='m';
			  j+=2;
		   }
		else if(vet[i]=='_')
		   {
			  vetdesc[j]='p';
			  vetdesc[j+1]='a';
			  j+=2;
		   }
		else if(vet[i]=='ª')
		   {
			  vetdesc[j]='r';
			  vetdesc[j+1]='a';
			  j+=2;
		   }
		else if(vet[i]=='ƒ')
		   {
			  vetdesc[j]='d';
			  vetdesc[j+1]='a';
			  j+=2;
		   }
		else if(vet[i]=='`')
		   {
			  vetdesc[j]='d';
			  vetdesc[j+1]='e';
			  j+=2;
		   }
		   else if(vet[i]=='§')
		   {
			  vetdesc[j]='d';
			  vetdesc[j+1]='o';
			  j+=2;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='a')
		   {
			  vetdesc[j]='q';
			  vetdesc[j+1]='u';
			  vetdesc[j+2]='e';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='b')
		   {
			  vetdesc[j]='m';
			  vetdesc[j+1]='e';
			  vetdesc[j+2]='n';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='c')
		   {
			  vetdesc[j]='c';
			  vetdesc[j+1]='o';
			  vetdesc[j+2]='m';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='d')
		   {
			  vetdesc[j]='i';
			  vetdesc[j+1]='n';
			  vetdesc[j+2]='f';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='e')
		   {
			  vetdesc[j]='p';
			  vetdesc[j+1]='o';
			  vetdesc[j+2]='r';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='f')
		   {
			  vetdesc[j]='c';
			  vetdesc[j+1]='a';
			  vetdesc[j+2]='n';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='g')
		   {
			  vetdesc[j]=' ';
			  vetdesc[j+1]='o';
			  vetdesc[j+2]='u';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='1'&&vet[i+1]=='h')
		   {
			  vetdesc[j]='u';
			  vetdesc[j+1]='m';
			  vetdesc[j+2]='a';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='&'&&vet[i+1]=='¿')
		   {
			  vetdesc[j]=' ';
			  vetdesc[j+1]='e';
			  vetdesc[j+2]=' ';
			  j+=3;
			  i++;
		   }
		   else if(vet[i]=='&'&&vet[i+1]=='-')
		   {
			  vetdesc[j]=' ';
			  vetdesc[j+1]='a';
			  vetdesc[j+2]=' ';
			  j+=3;
			  i++;
		   }
		   else
		   {
		   vetdesc[j]=vet[i];
		   j++;
		   }
	}
}
void mostraarquivo(char op,char arqorigem[20],char arqdestino[20])
{
	char mostrar[20];
	if(op=='O'||op=='o')
	{
	fstream arqc;
	arqc.open(arqorigem,ios::in);
	char n[70];
	while(!arqc.eof())
	{
		arqc.read(n,1);
		n[1]=0;
		if(!arqc.eof())
		{
			cout<<n[0];
		}
	}
	cout.flush();
	arqc.close();				
	}
	else
	{
	fstream arqd;
	arqd.open(arqdestino,ios::in);
	char n[70];
	while(!arqd.eof())
	{
		arqd.read(n,1);
		n[1]=0;
		if(!arqd.eof())
		{
			cout<<n[0];
		}
	}
	cout.flush();
	arqd.close();
	}
	cout<<"\nPrecione uma tecla para voltar ao menu principal"<<endl;
	getch();
	system("cls");
}

int main()
{
	int opcao=0,quantcomp;
	char arqorigem[20],arqdestino[20];
	arqorigem[0]='*';
	arqdestino[0]='*';

	while(opcao!=5){
	cout<<"\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"<<endl;
	cout<<"\t\tº"<<"\tBem vindo ao Gerds Compressor	   º"<<endl;
	cout<<"\t\tº"<<"\tEscolha uma das Opções:			 º"<<endl;
	cout<<"\t\tº"<<"\t1 - Compactar Arquivo			   º"<<endl;
	cout<<"\t\tº"<<"\t2 - Descompactar Arquivo			º"<<endl;
	cout<<"\t\tº"<<"\t3 - Cadastrar Apelidos			  º"<<endl;
	cout<<"\t\tº"<<"\t4 - Ver Arquivo					 º"<<endl;
	cout<<"\t\tº"<<"\t5 - Sair							º"<<endl;
	cout<<"\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"<<endl;//172
	cin>>opcao;
	
	if(opcao==1)
	{
	   cout<<"Digite o nome do arquivo a ser compactado: \n(O arquivo deve estar na mesma pasta que o descompactador)"<<endl;
	   cin>>arqorigem;
	   cout<<"Digite o nome do arquivo a ser gerado"<<endl;
	   cin>>arqdestino;
	   fstream arqA;
	   arqA.open(arqorigem, ios::in);
	
	   char n[70];
	   int i=0;
	   while(!arqA.eof()) 
	   {
		
		  arqA.read(n,1);
		  n[1]=0;
		  if(!arqA.eof())
		  {
			 i++;
		  }
	   }
	   cout.flush();
	   arqA.close();
		 cout<<"Caracteres encontrados no arquivo "<<arqorigem<<" :"<<i<<endl;
		 char *vet;
	   vet=(char *)malloc(i*sizeof(int));
	   learquivo(vet,arqorigem);
	   comprime(vet,i);
	   cout<<"\nIniciando Compactação\n";
	   armazena(vet,i,arqdestino);
	   cout<<"\nDocumento Compactado\n";
	   
	   fstream arq2;
	   arq2.open(arqdestino, ios::in);
	   int q=0;
	   char b[70];
	   while(!arq2.eof())
		{
		
			 arq2.read(b,1);
			 b[1]=0;
			 if(!arq2.eof())
			 {
				 q++;
			 }
		}
		cout.flush();
		arq2.close();
	
		cout<<"Caracteres no "<< arqdestino<<" compactado: "<<q<<endl;
		cout<<"Pressione uma tecla para voltar ao menu principal"<<endl;
		getch();
		opcao=0;
		system("cls");
	}
	else if(opcao==2)
	{
		cout<<"Digite o nome do arqorigem a ser descompactado"<<endl;
		cin>>arqorigem;
		cout<<"Digite o nome do arqorigem a ser gerado"<<endl;
		cin>>arqdestino;
	
		fstream arqdes;
		arqdes.open(arqorigem, ios::in);
		char n[70];
		int i=0;
		while(!arqdes.eof())
		{
		
			arqdes.read(n,1);
			n[1]=0;
			if(!arqdes.eof())
			{
				 i++;
			}
		}
		cout.flush();
		arqdes.close();
		cout<<"O arquivo: " <<arqorigem<<" a ser descompactado possui "<<i<<" caracteres"<<endl;
		char *vet;
		vet=(char *)malloc(i*sizeof(int));
		learquivo(vet,arqorigem);
		int j;
		j=calculavetB(vet,i);
		cout<<"\nO arquivo: "<<arqdestino<<" terá "<<j<<" caracteres\n";
		char *vetdesc;
		vetdesc=(char *)malloc(j*sizeof(int));
		converte(vet,vetdesc,j);
		armazena(vetdesc,j,arqdestino);
		cout<<"\nDocumento Descompactado\n";
		cout<<"Pressione uma tecla para voltar ao menu principal"<<endl;
		getch();
		opcao=0;
		system("cls");
	}
	else if(opcao==3)
	{
	 }
	else if(opcao==4)
	{
		 char op;
		 op='A';
		 while(op!='o'&&op!='d'&&op!='O'&&op!='D')
		 {
			cout<<"Digite O para origem e D para destino"<<endl;
			op=getch();
			if(arqorigem[0]=='*'&&(op=='o'||op=='O'))
			{
			 cout<<"Arquivo origem nao digitado anteriormente"<<endl;
			 cout<<"Digite o Nome do arquivo"<<endl;
			 cin>>arqorigem;
			}
			if(arqdestino[0]=='*'&&(op=='d'||op=='D'))
			{
			 cout<<"Arquivo Destino nao digitado anteriormente"<<endl;
			 cout<<"Digite o Nome do arquivo"<<endl;
			 cin>>arqdestino;
			}
		 }
		 mostraarquivo(op,arqorigem,arqdestino);
	}

  }
}

}
OBS: Este compactador terá objetivo apenas para o estudo dos métodos existentes de compressão, portanto neste caso ele apenas funcionará com arquivos .txt o qual o usuario tera que digitar a extensão .txt por exemplo, nomedoarquivo.txt

 

Aprendemos neste trabalho a manipular arquivos .txt alocando-os em um vetor o qual poderemos manipular efetuando assim as trocas necessarias, trabalhamos com a tabela ascii, e tambem vimos a função malloc para vetores de tamanho ainda indefinidos e aprendemos a manipular textos com espaço entre os caracteres.

 

Utilizei o compactador em um arquivo .txt de 23 MB e conseguiu compactar para 20 MB pelo tamanho da biblioteca de conversão utilizada até foi um grande ganho visto que o este programa tem o tamanho de 591 KB com todo o codigo e os compactadores atuais tem 4 MB somente de biblioteca.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Topico atualizado incluido o metodo de compactação Runlenght testes efetuados:

 

o arquivo aaa.txt tinha em seu conteudo original:

 

Compactação metodo Runlengt:

111222223333355556666000000

aaa bbb cccc
9  eeeeeeeee
1 a
2 aa
3 aaa
4 aaaa
5 aaaaa
6 aaaaaa
7 aaaaaaa
8 aaaaaaaa
9 aaaaaaaaa

12  dddddddddddd
21  aaaaaaaaaaaaaaaaaaaaa

10  aaaaaaaaaa



11  aaaaaaaaaaa

20  aaaaaaaaaaaaaaaaaaaa
40   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Compactação de texto:

A taxa de desemprego nas seis regiões pesquisadas pelo Departamento Intersindical de Estatísticas e Estudos Socioeconômicos (Dieese) e pelo Seade recuou para 14,1% em setembro, ante taxa de 14,5% no mês anterior. O indicador é o menor para um mês de setembro desde 1998. Segundo o estudo, o desempenho de queda é típico para o período.

O nível de ocupação nas áreas pesquisadas subiu 0,8% em setembro em relação a agosto. O número de postos de trabalho criados (130 mil) superou o de pessoas que ingressaram no mercado de trabalho (58 mil), o que resultou no decréscimo do contingente de desempregados (72 mil), para 2,839 milhões de pessoas. Na comparação com setembro de 2007, o nível de ocupação aumentou 5,6%.

O total de ocupados nas seis regiões foi estimado em 17,347 milhões de pessoas. A pesquisa foi realizada nas regiões metropolitanas de Belo Horizonte, Porto Alegre, Recife, Salvador, São Paulo e Distrito Federal.

 
  Rendimento

No conjunto das regiões pesquisadas, o rendimento médio real dos ocupados elevou-se em 1% na passagem de julho para agosto, passando a R$ 1.171,00 – uma alta de 4,8% frente a agosto de 2007. Já o rendimento dos assalariados ficou 0,4% menor, tornando-se equivalente a R$ 1.227.

A massa do rendimento dos ocupados apresentou aumento de 1,6% em agosto ante julho e subiu 10% em comparação a agosto de 2007. Segundo a pesquisa, a pequena elevação da massa de salários, de 0,7%, por sua vez, "refletiu o crescimento do nível de emprego, já que o salário médio real variou negativamente".

 
  São Paulo

O arquivo compactado comp.txt ficou com o seguinte conteudo:

 

Com_ctaçÄ meto§ Runlengt:

1©32©53©55©46©40©6

a©3 b©3 c©4
9  e©9
1 a
2 aa
3 a©3
4 a©4
5 a©5
6 a©6
7 a©7
8 a©8
9 a©9

12  dæ2
21  aæ9aa

10  aæ0

©311  aæ1

20  aæ9a
40 ©3aæ9aaæ9a

Com_ctaçÄ ` texto:

A taxa ` `s~prego ¿s seis regiõ¨ p¨quisaƒs pelo De_rt´ento Intersindical ` Estatístic¦&¿Estu§s Socioeconômic® (Die¨e)&¿pelo Sea` recuou _ª 14,1% ~ set~bro, ante taxa ` 14,5% ^ mês anterior. O indica§r é o 1bor _ª um mês ` set~bro `s` 1998. Segun§ o ¨tu§, o `s~penho ` 1aƒ é típico _ª o perío§.

O nível ` ocu_çÄ ¿s áre¦ p¨quisaƒs subiu 0,8% ~ set~bro ~ relaçÄ&-ag®to. O número ` p®t® ` tªbalho cria§s (130 mil) superou o ` p¨so¦ 1a ingr¨saªm ^ merca§ ` tªbalho (58 mil), o 1a r¨ultou ^ `créscimo § contingente ` `s~prega§s (72 mil), _ª 2,839 milhõ¨ ` p¨so¦. Na 1c_ªçÄ 1c set~bro ` 2007, o nível ` ocu_çÄ au1btou 5,6%.

O total ` ocu_§s ¿s seis regiõ¨ foi ¨tima§ ~ 17,347 milhõ¨ ` p¨so¦. A p¨quisa foi realizaƒ ¿s regiõ¨ metropolita¿s ` Belo Horizonte, Porto Alegre, Recife, Salva§r, SÄ Paulo&¿Distrito Fe`ªl.

 
  Rendi1bto

No conjunto ƒs regiõ¨ p¨quisaƒs, o rendi1bto médio real §s ocu_§s elevou-se ~ 1% ¿ _ssag~ ` julho _ª ag®to, _ssan§&-R$ 1.171,00 – 1h alta ` 4,8% frente&-ag®to ` 2007. Já o rendi1bto §s ¦salaria§s ficou 0,4% 1bor, tor¿n§-se equivalente&-R$ 1.227.

A m¦sa § rendi1bto §s ocu_§s apr¨entou au1bto ` 1,6% ~ ag®to ante julho&¿subiu 10% ~ 1c_ªçÄ&-ag®to ` 2007. Segun§&-p¨quisa,&-pe1a¿ elevaçÄ ƒ m¦sa ` salári®, ` 0,7%, 1e sua vez, "refletiu o cr¨ci1bto § nível ` ~prego, já 1a o salário médio real variou negativ´ente".

 
  SÄ Paulo
O arquivo desc.txt gerado da descompactação do arquivo comp.txt ficou com o seguinte conteúdo:

 

Compactação metodo Runlengt:

111222223333355556666000000

aaa bbb cccc
9  eeeeeeeee
1 a
2 aa
3 aaa
4 aaaa
5 aaaaa
6 aaaaaa
7 aaaaaaa
8 aaaaaaaa
9 aaaaaaaaa

12  dddddddddddd
21  aaaaaaaaaaaaaaaaaaaaa

10  aaaaaaaaaa



11  aaaaaaaaaaa

20  aaaaaaaaaaaaaaaaaaaa
40   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Compactação de texto:

A taxa de desemprego nas seis regiões pesquisadas pelo Departamento Intersindical de Estatísticas e Estudos Socioeconômicos (Dieese) e pelo Seade recuou para 14,1% em setembro, ante taxa de 14,5% no mês anterior. O indicador é o menor para um mês de setembro desde 1998. Segundo o estudo, o desempenho de queda é típico para o período.

O nível de ocupação nas áreas pesquisadas subiu 0,8% em setembro em relação a agosto. O número de postos de trabalho criados (130 mil) superou o de pessoas que ingressaram no mercado de trabalho (58 mil), o que resultou no decréscimo do contingente de desempregados (72 mil), para 2,839 milhões de pessoas. Na comparação com setembro de 2007, o nível de ocupação aumentou 5,6%.

O total de ocupados nas seis regiões foi estimado em 17,347 milhões de pessoas. A pesquisa foi realizada nas regiões metropolitanas de Belo Horizonte, Porto Alegre, Recife, Salvador, São Paulo e Distrito Federal.

 
  Rendimento

No conjunto das regiões pesquisadas, o rendimento médio real dos ocupados elevou-se em 1% na passagem de julho para agosto, passando a R$ 1.171,00 – uma alta de 4,8% frente a agosto de 2007. Já o rendimento dos assalariados ficou 0,4% menor, tornando-se equivalente a R$ 1.227.

A massa do rendimento dos ocupados apresentou aumento de 1,6% em agosto ante julho e subiu 10% em comparação a agosto de 2007. Segundo a pesquisa, a pequena elevação da massa de salários, de 0,7%, por sua vez, "refletiu o crescimento do nível de emprego, já que o salário médio real variou negativamente".

 
  São Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.