-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'なく、2892 バイト (289/256 =1および 289/256 = 33) として保存する必要があります。明らかに、すべての (サブ) 文字列に対してこれを実行し、翻訳テーブルを出力ファイル内に保存して、再度翻訳できるようにする必要があります。

于 2013-03-06T20:07:13.277 に答える