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