2013-03-06 2 views
-5

J'essayais de mettre en œuvre la compression LZ .... et essayait de compresser certains fichiers en utilisant .... mais j'ai un problème logique ... Je ne sais pas vraiment au sujet de comment les données doivent être stockées dans le fichier ... le vrai problème est: supposons que j'ai une chaîne correspondante "ls" [dont l'entrée dans la table est déjà faite au 289e index] maintenant si remplacer 289 par ls dans le fichier alors comment ça se fait? parce que si "ls" Plus tôt a pris 2 octets alors maintenant 289 prendra 3 octets. Si ci-dessus est vrai alors pourquoi cette méthode est appelée compression et si non alors quelle sera la bonne méthode ... J'ai juste besoin d'une réponse qui me clarifie sur cette logique en détail.LZ technique de compression

Une partie du code que j'ai fait jusqu'à présent:

int main() 
{ 
    int id,flag,d; 
    char ch,a[2],newstr[1000],currstr[1000]; 
    FILE *fr; 
    FILE *fw; 
    createTable(); 
    fr=fopen("old.txt","rb"); 
    fw=fopen("new.txt","wb"); 
    flag=0; 
    fscanf(fr,"%c",&ch); 
    fprintf(fw,"%c",ch); 
    a[0]=ch; 
    a[1]='\0'; 
    strcpy(currstr,a); 
    while(!feof(fr)) 
    { 
     showTable(); 
     fscanf(fr,"%c",&ch); 
     a[0]=ch; 
     a[1]='\0'; 
     strcat(currstr,a); 
     strcpy(newstr,currstr); 
     id=lookTable(newstr); 
     if(id!=5000) 
     { 
      strcpy(currstr,newstr); 
      flag=1; 
      d=id; 
     } 
     else 
     { 
      if (flag==0) 
      { 
       fprintf(fw,"%s",a); 
      } 
      else 
      { 
       fprintf(fw,"%d",d); 
       printf("%d new data\n",d); 
      } 
      addEntry(newstr); 
      strcpy(currstr,a); 
      flag=0; 
     } 
    } 
    fprintf(fw,"%s",currstr); 
    fclose(fr); 
    fclose(fw); 
    return 0; 
} 

Répondre

2

En règle générale, les données compressées ne sont pas stockées sous forme de fichier texte, de sorte que votre valeur 289 ne devrait probablement pas être stocké sous forme de texte '2', '8', '9', mais comme nombre de 289 sous la forme de deux octets (289/256 = 1 et 289/256 = 33). Vous devrez évidemment faire cela pour toutes les (sous) chaînes, et stocker la table de traduction dans le fichier de sortie, de sorte que vous puissiez la traduire à nouveau.