2013-03-06 84 views
-5

我试图实现LZ压缩....并试图压缩一些文件使用它....但我有一些合乎逻辑的问题... 我真的没有任何想法如何将数据存储回文件... 真正的问题是:假设我有一个匹配的字符串“ls”[谁的表中的条目已经完成了,我们假设第289个索引]现在如果在文件中将ls替换为289那么怎么做呢? ,因为如果早些时候“ls”花了2个字节,那么现在289将需要3个字节。 如果上述情况属实,那么为什么这种方法称为压缩,如果不是,那么正确的方法是什么...... 我只是需要一个答案来澄清我对这个逻辑的详细说明。LZ压缩技术

一些代码,我已经做至今:

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; 
} 

回答

2

通常情况下,压缩后的数据不存储为文本文件,所以你的价值289可能不应该被存储为文本'2', '8', '9',但作为作为两个字节的289的编号(289/256 = 1和289/256 = 33)。您显然必须为所有(子)字符串执行此操作,并将转换表存储在输出文件中,以便您可以将其翻译回来。