我正在尝试实施LZ压缩....并且正在尝试使用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;
}
最佳答案
通常,压缩数据不会存储为文本文件,因此您的值289
可能不应存储为文本'2', '8', '9'
,而应存储为两个字节的289
数(289/256 = 1
和289/256 = 33
)。显然,您必须对所有(子)字符串执行此操作,并将转换表存储在输出文件中,以便可以再次将其转换回。
关于c - LZ压缩技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15256689/