2013-03-06 86 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)。您顯然必須爲所有(子)字符串執行此操作,並將轉換表存儲在輸出文件中,以便您可以將其翻譯回來。