-4

我试图实现 LZ 压缩....并试图使用它来压缩一些文件....但是我遇到了一些逻辑问题...我真的不知道如何存储数据返回文件...真正的问题是:假设我现在有一个匹配的字符串“ls”[表中的条目已经在第 289 个索引处完成] 如果将文件中的 289 替换为 ls 那么该怎么做? ? 因为如果较早的“ls”占用 2 个字节,那么现在 289 将占用 3 个字节。如果以上是正确的,那么为什么这种方法称为压缩,如果不是,那么正确的方法是什么……我只需要一个答案,特别是详细地阐明我对这个逻辑的了解。

我到现在为止制作的一些代码:

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

1 回答 1

3

通常,压缩数据不存储为文本文件,因此您的值289可能不应该存储为 text '2', '8', '9',而是存储289为两个字节的数量(289/256 =1和 289/256 = 33)。您显然必须对所有(子)字符串执行此操作,并将翻译表存储在输出文件中,以便您可以再次将其翻译回来。

于 2013-03-06T20:07:13.277 回答