資料壓縮演算法學習(一)---RLE演算法
阿新 • • 發佈:2019-02-19
#include<stdio.h> #include<stdlib.h> #include<string.h> FILE *infile,*outfile; /*定義全域性變數*/ void Compress(char *infilename,char *outfilename);/*壓縮函式*/ void Common(char *filename);/*開啟失敗的提示*/ void main(int argc,char *argv[]) { printf("rleys compress file\n");/*輸入提示*/ if(argc!=3) /*判斷輸入的引數格式是否正確*/ { printf("\n usage:rleys sourcefilename targetfilename\n"); exit(0);/*退出程式*/ } printf("\n compression ..."); Compress(argv[1],argv[2]);/*呼叫函式Compress()壓縮資料*/ fclose(infile); /*關閉檔案*/ fclose(outfile); } void Common(char *filename) { char tempspace[200]; strcpy(tempspace,"\nUnable to open ");/*將字串複製到陣列tempspace內*/ strcat(tempspace,filename);/*將字串filename連結到字串tempspace後面*/ puts(tempspace); exit(1); /*退出程式*/ } void Compress(char *infilename,char *outfilename)/*壓縮檔案*/ { register int seq_len; char cur_char,cur_seq; if((infile=fopen(infilename,"rb"))==NULL)/*判斷檔案是否開啟成功*/ Common(infilename); if((outfile=fopen(outfilename,"wb"))==NULL)/*判斷檔案是否建立成功*/ Common(outfilename); cur_char=fgetc(infile); // 取得檔案第一個字元 cur_seq=cur_char; // 將第一個字元賦值給seq seq_len=1; // 字元連續出現次數,長度初始化為1 while(!feof(infile)) /*進行壓縮*/ { cur_char=fgetc(infile); // 取得檔案的下一個字元 if(cur_char==cur_seq) // 檔案上一個字元是否與當前字元相等 { seq_len++; // 相等則連續長度加一 } else { fputc(seq_len,outfile); fputc(cur_seq,outfile); // 不相等,則輸出連續的長度和對應字元 cur_seq=cur_char; // 將不相等的第一個字元賦值給seq,開始下次長度計算 seq_len=1; // 長度歸於一 } } }
解壓演算法實現,C語言