Страница 1 из 1

Сжатие алгоритмом РЛЕ

Добавлено: 16 ноя 2004, 23:22
Венечка
Товарищи!
Гляньте код - это сжатие файла алгоритмом RLE???
Если да, то где нужно вписать путь к файлу, который требуется сжать?
Допустим мне надо сжать bmp-картинку, которая находится С:\Мои документы\машинка.bmp

Код: Выделить всё

 #include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <fcntl.h>
#include <sys\stat.h>

class Counter{
public:
	Counter(int b):data(0),bound(b){};
	int operator ++()
		{data++;if(data>=bound){data=0;cout<<'o';}return data;}
private:
	int data;
	int bound;
} ;
void UnPackFile(char * InFile,char * OutFile)
{
	int in=_open(InFile,O_RDONLY);
	int out=open(OutFile,O_WRONLY|O_CREAT|O_TRUNC,S_IWRITE);
	unsigned char c,c1;
	Counter j(32767);
	cout << "Распаковыается :"<<InFile<<" ";
	while(++j,_read(in,&c,1)) {
		for(int i=0;i<c;i++){
			_read(in,&c1,1);
			++j;
			_write(out,&c1,1);
		}
		_read(in,&c,1);
		++j;
		for(i=0;i<c;i++)
			_write(out,&c1,1);
	}
	cout <<"\n";
	_close(in);
	_close(out);
}
void PackFile(char * InFile,char * OutFile)
{
	int in=_open(InFile,O_RDONLY);
	int out=open(OutFile,O_WRONLY|O_CREAT|O_TRUNC,S_IWRITE);
	int repeat=0;
	int pos=1;
	unsigned char c,c1;
	unsigned char buf [257];
	buf[0]=0;
	Counter j(32767);
	cout << "Запаковывается :"<<InFile<<" ";
	while(++j,_read(in,&c,1)) {
		if(!repeat){
			if(pos==255){
			  if(c!=c1){
				buf[pos]=c;
				buf[0]++;
				buf[pos+1]=0;
				_write(out,buf,257);
				buf[0]=0;
				pos=1;
			  }
			  else {
			  repeat=1;
			  buf[pos]=1;
			  }
			}
			else
			if(pos!=1&&c==c1){
				repeat=1;
				buf[pos]=1;
			}
			else{
				buf[pos]=c;
				buf[0]++;
				c1=c;
				pos++;
			}
		}
		else{
			if(buf[pos]==255||c!=c1){
				_write(out,buf,pos+1);
				repeat=0;
				buf[0]=1;
				buf[1]=c;
				c1=c;
				pos=2;
			}
			else
				buf[pos]++;
		}
	}
	if(!repeat)
		buf[pos]=0;
	cout<<'\n';
	_write(out,buf,pos+1);
	_close(in);
	_close(out);
}
int ProcessArguments(int argc,char* argv[])
{
	cout<<"Прога сжатия данных по алгоритму RLE.\n"
		<<"";
	if(argc!=4&&argc!=5)return 0;
	if(*argv[1]!='p'&&*argv[1]!='P'&&
	   *argv[1]!='u'&&*argv[1]!='U' ) return 0;
	if(*argv[1]=='p'||*argv[1]=='P')return 1;
	if(*argv[1]=='u'||*argv[1]=='U')return 2;
	return -1;
}
void How2Use()
{
	cout << "Использование программы:\n";
	cout << "   rle команда ВходнойФайл ВыходнойФайл \n";
	cout << "Команды :\n";
	cout << "   p  запак ВхФ в ВыхФ  \n";
	cout << "   u   распак ВхФ в ВыхФ \n\n";
//	cout << "если ключ не ук, то он запрашив с клавы\n";
}
void main(int argc,char* argv[])
{

	switch(ProcessArguments(argc,argv))
	{
		case 0:
			How2Use();
			break;
		case 1:
			PackFile(argv[2],argv[3]);
			break;
		case 2:
			UnPackFile(argv[2],argv[3]);
			break;
	}

}

Добавлено: 17 ноя 2004, 16:35
Kolinus
Не знаю что заалгоритм но имя надо определенно вписать в функцию PackFile