www.pudn.com > ch02.rar > rl_c.c
// 程式名稱:
rl_c.c
// 程式功能:
變動長度編碼壓縮(Run Length Encoding)
// 執行方式:
rl_c 資料檔名 壓縮檔名
// 程式說明:
1. 參考2.2節 變動長度編碼法
// 2. 整數採用固定長度一個位元組表示法
// 3. 對於只出現一次的位元組S亦用iS取代
#include
FILE *infile,*outfile;
int main(int argc,char *argv[])
{
switch(argc)
{
case 1 :
printf("無資料檔名!\n");
printf("執行方式為 C>rl_c 資料檔名 壓縮檔名\n");
exit(1);
break;
case 2:
printf("無壓縮檔名!\n");
printf("執行方式為 C>rl_c 資料檔名 壓縮檔名\n");
exit(1);
break;
case 3:
if ((infile = fopen(argv[1],"rb")) == NULL)
{
printf("無法開啟資料檔 %s !\n",argv[1]);
exit(1);
}
if ((outfile = fopen(argv[2],"wb")) == NULL)
{
printf("無法開啟壓縮檔 %s !\n",argv[2]);
exit(1);
}
}
c_runlength();
fclose(infile);
fclose(outfile);
return(0);
}
int c_runlength()
{
int i,S,next_S;
S = fgetc(infile);
i = 1;
while ((next_S = fgetc(infile)) != EOF){
if (S == next_S)
i++;
else
{
compress(i,S);
S = next_S;
i = 1;
}
}
if (i > 0)
compress(i,S);
return(0);
}
int compress(int i,int S)
{
while (i >= 256){ // 以255個位元組為一個段落
fputc(255,outfile);// 共輸出 i/255 + 1 段
fputc(S,outfile);
i = i - 255;
}
if (i > 0){
fputc(i,outfile);
fputc(S,outfile);
}
return(0);
}