我必须做一个能够对每个文件进行编码和解码的rle算法(转义字符)。 我做了第一部分(编码),现在已经开始解码部分,我可以看到一些问题。例如:
如果我有一个文件,里面有:AAAAABBBBBBCCCCCDDD
我做的编码函数给出了这样的输出:QA5QB6QC5DDD
但你必须认为我必须使用真实文件,所以里面不仅有字母,还有数字和符号。
那么,在编码部分之后,如果在编码文件中有QA55
之类的东西,我必须做什么?
输出必须是AAAAA5
或五十五A
?
另一个例子,如果我必须阅读QA5
哪个是最终输出? AAAAA
或仅QA5
?
我的意思是我不知道当我正在阅读的字母块是否有编码时,我怎么能识别出来。
这是我的编码功能:
void encode (FILE *source, FILE *destination) {
char currentChar;
char seqChar = 'Z'; //could be any character
int count = 0;
while(1) {
int endFile = (fread(¤tChar, sizeof(char),1, source) == 0);
if(endFile || seqChar!=currentChar) {
if(count>3) {
char escape = 'Q';
int k = count;
char str[100];
int digits = sprintf(str,"%d",count);
fwrite(&escape, sizeof(escape), 1, destination);
fwrite(&seqChar, sizeof(escape),1, destination);
fwrite(&str, sizeof(char), digits, destination);
}
else {
for(int i=0;i<count;i++)
fwrite(&seqChar,sizeof(char),1,destination);
}
seqChar = currentChar;
count =1;
}
else count++;
if(endFile)
break;
}
fclose(source);
fclose(destination);
}
我希望你知道我的意思,
当然,我认为,为了解决这个问题,我必须发明一些惯例,但我无法弄清楚哪种和那种。
答案 0 :(得分:1)
如何在C字符串中放置文字反斜杠?你如何用printf写一个百分号?您必须找到表示转义字符本身的转义序列。
你的逃脱角色是 Q (顺便说一下,这是个奇怪的选择)。然后 Q + 字符 + 计数可能意味着:字符,计数次。 QQ 可能意味着逃脱角色本身。
你会发现你不能用这种方式压缩 Q 的序列,因为 Q 已经意味着“Q”。解决这个问题有两种可能性:摆脱 QQ 的特殊含义,并始终将“Q”编码为一个“Q”的序列,即。的 QQ1 即可。或者将计数放在要编码的字符前面,并使 Q 不是有效计数。
(顺便说一下,这不是一个C问题,而是更多关于压缩算法的设计。你可能想重新标记它并删除代码。)