Advertisement
JorelFerreira00

Untitled

May 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "a.h"
  6.  
  7. typedef struct Lista{
  8.     char cadeia[100];
  9.     int codigo;
  10.     struct Lista* prox;
  11. }dicionario;
  12.  
  13. void inserir ( dicionario *LISTA, char cadeia[100], int* quant) {
  14.     dicionario *novo = (dicionario*)malloc(sizeof(dicionario));
  15.     novo->prox = NULL;
  16.     novo->codigo = (*quant);
  17.     strcpy(novo->cadeia, cadeia);
  18.     if (LISTA->prox == NULL){
  19.         LISTA->prox = novo;
  20.     }else{
  21.         dicionario *aux = LISTA -> prox;
  22.         while ( aux -> prox != NULL ){
  23.             aux = aux -> prox;
  24.         }
  25.         aux -> prox = novo;
  26.     }
  27.     (*quant)++;
  28. }
  29.  
  30. int procura(dicionario* d, char cadeia[100]){
  31.     if(d!=NULL){
  32.         if(strcmp(d->cadeia, cadeia)==0){
  33.             return d->codigo;
  34.         }
  35.         return procura(d->prox, cadeia);
  36.     }
  37.     return -1;
  38. }
  39.  
  40. void mostra(dicionario* d){
  41.     if(d!=NULL){
  42.         printf("cadeia: %s\n", d->cadeia);
  43.         printf("codigo: %d\n", d->codigo);
  44.         if(d->prox==NULL){
  45.             printf("ACABOU!!\n");
  46.         }
  47.         mostra(d->prox);
  48.     }
  49. }
  50.  
  51. int main(int argc, char* argv[]){
  52.  
  53.     int quant = 1;
  54.     int codigoAntigo;
  55.     char codigoAntigoConv[100];
  56.     char aux[2];
  57.     char nomeArq[50], nomeArq2[50];
  58.     char cadeia[100] = "";
  59.     char saida[1000] = "";
  60.     char* arquivolido;
  61.     FILE* arq;
  62.     FILE* compact;
  63.     dicionario* d = (dicionario*)malloc(sizeof(dicionario));
  64.  
  65.     strcpy(d->cadeia, "");
  66.     d->codigo = 0;
  67.     d->prox = NULL;
  68.  
  69.     printf("Digite o nome do arquivo a ser compactado: ");
  70.     scanf("%s", nomeArq);
  71.     printf("Digite o nome do arquivo a ser salvo: ");
  72.     scanf("%s", nomeArq2);
  73.  
  74.     compact = fopen(nomeArq2, "wb");
  75.     arq = fopen(nomeArq, "rb");
  76.     if(arq==NULL){
  77.         printf("Erro ao ler arquivo!!!\n");
  78.     }else{
  79.         while(!feof(arq)){
  80.             /**le 8 bits do arq*/
  81.             arquivolido = le(8, arq);
  82.             /**aplica o metodo para os 8 bits*/
  83.             for(int i=0; i<8 && arquivolido[i]!=EOF; i++){
  84.                 aux[0] = arquivolido[i];
  85.                 aux[1] = '\0';
  86.                 codigoAntigo = procura(d, cadeia);      //codigo da cadeia antiga(q esta no dic)
  87.                 strcat(cadeia, aux);                    //cadeia + novo bit
  88.                 if(procura(d, cadeia)==-1){             //se cadeia + novo bit nao estiver no dic:
  89.                     int i, j;
  90.                     for(i=0, j=codigoAntigo; pow(2,i)<quant || i<1; i++, j = j/2){  //converte o codigo para stringBinaria(invertido)
  91.                         codigoAntigoConv[i] = j%2 + '0';
  92.                     }
  93.                     codigoAntigoConv[i] = '\0';
  94.                     strrev(codigoAntigoConv);           //inverte pra ficar certo
  95.                     strcat(saida, codigoAntigoConv);    //saida recebe o codigo(em stringBinaria) da cadeia
  96.                     strcat(saida, aux);                 //saida recebe o novo bit q quebrou(nao estava no dic)
  97.                     inserir(d, cadeia, &quant);         //insere cadeia+novo bit no dic
  98.                     strcpy(cadeia, "");                 //cadeia recebe ""
  99.                 }
  100.             }
  101.             escreve(saida, compact);                    //escreve esses 8bits no arq
  102.         }
  103.         /**finaliza o arquivo com a ultima cadeia*/
  104.         strcpy(saida, "");
  105.         int i, j;
  106.         codigoAntigo = procura(d, cadeia);
  107.         for(i=0, j=codigoAntigo; pow(2,i)<quant || i<1; i++, j = j/2){
  108.             codigoAntigoConv[i] = j%2 + '0';
  109.         }
  110.         codigoAntigoConv[i] = '\0';
  111.         strrev(codigoAntigoConv);
  112.         strcat(saida, codigoAntigoConv);
  113.         strcpy(cadeia, "");
  114.         escreve(saida, compact);
  115.         escreve("", compact);
  116.     }
  117.     free(arquivolido);
  118.     fclose(arq);
  119.     fclose(compact);
  120.  
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement