1. 程式人生 > >資料壓縮演算法學習(一)---RLE演算法

資料壓縮演算法學習(一)---RLE演算法

#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語言