Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include "a.h"
- typedef struct Lista{
- char cadeia[100];
- int codigo;
- struct Lista* prox;
- }dicionario;
- void inserir ( dicionario *LISTA, char cadeia[100], int* quant) {
- dicionario *novo = (dicionario*)malloc(sizeof(dicionario));
- novo->prox = NULL;
- novo->codigo = (*quant);
- strcpy(novo->cadeia, cadeia);
- if (LISTA->prox == NULL){
- LISTA->prox = novo;
- }else{
- dicionario *aux = LISTA -> prox;
- while ( aux -> prox != NULL ){
- aux = aux -> prox;
- }
- aux -> prox = novo;
- }
- (*quant)++;
- }
- int procura(dicionario* d, char cadeia[100]){
- if(d!=NULL){
- if(strcmp(d->cadeia, cadeia)==0){
- return d->codigo;
- }
- return procura(d->prox, cadeia);
- }
- return -1;
- }
- void mostra(dicionario* d){
- if(d!=NULL){
- printf("cadeia: %s\n", d->cadeia);
- printf("codigo: %d\n", d->codigo);
- if(d->prox==NULL){
- printf("ACABOU!!\n");
- }
- mostra(d->prox);
- }
- }
- int main(int argc, char* argv[]){
- int quant = 1;
- int codigoAntigo;
- char codigoAntigoConv[100];
- char aux[2];
- char nomeArq[50], nomeArq2[50];
- char cadeia[100] = "";
- char saida[1000] = "";
- char* arquivolido;
- FILE* arq;
- FILE* compact;
- dicionario* d = (dicionario*)malloc(sizeof(dicionario));
- strcpy(d->cadeia, "");
- d->codigo = 0;
- d->prox = NULL;
- printf("Digite o nome do arquivo a ser compactado: ");
- scanf("%s", nomeArq);
- printf("Digite o nome do arquivo a ser salvo: ");
- scanf("%s", nomeArq2);
- compact = fopen(nomeArq2, "wb");
- arq = fopen(nomeArq, "rb");
- if(arq==NULL){
- printf("Erro ao ler arquivo!!!\n");
- }else{
- while(!feof(arq)){
- /**le 8 bits do arq*/
- arquivolido = le(8, arq);
- /**aplica o metodo para os 8 bits*/
- for(int i=0; i<8 && arquivolido[i]!=EOF; i++){
- aux[0] = arquivolido[i];
- aux[1] = '\0';
- codigoAntigo = procura(d, cadeia); //codigo da cadeia antiga(q esta no dic)
- strcat(cadeia, aux); //cadeia + novo bit
- if(procura(d, cadeia)==-1){ //se cadeia + novo bit nao estiver no dic:
- int i, j;
- for(i=0, j=codigoAntigo; pow(2,i)<quant || i<1; i++, j = j/2){ //converte o codigo para stringBinaria(invertido)
- codigoAntigoConv[i] = j%2 + '0';
- }
- codigoAntigoConv[i] = '\0';
- strrev(codigoAntigoConv); //inverte pra ficar certo
- strcat(saida, codigoAntigoConv); //saida recebe o codigo(em stringBinaria) da cadeia
- strcat(saida, aux); //saida recebe o novo bit q quebrou(nao estava no dic)
- inserir(d, cadeia, &quant); //insere cadeia+novo bit no dic
- strcpy(cadeia, ""); //cadeia recebe ""
- }
- }
- escreve(saida, compact); //escreve esses 8bits no arq
- }
- /**finaliza o arquivo com a ultima cadeia*/
- strcpy(saida, "");
- int i, j;
- codigoAntigo = procura(d, cadeia);
- for(i=0, j=codigoAntigo; pow(2,i)<quant || i<1; i++, j = j/2){
- codigoAntigoConv[i] = j%2 + '0';
- }
- codigoAntigoConv[i] = '\0';
- strrev(codigoAntigoConv);
- strcat(saida, codigoAntigoConv);
- strcpy(cadeia, "");
- escreve(saida, compact);
- escreve("", compact);
- }
- free(arquivolido);
- fclose(arq);
- fclose(compact);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement