Сжатие алгоритмом РЛЕ
Добавлено: 16 ноя 2004, 23:22
Товарищи!
Гляньте код - это сжатие файла алгоритмом RLE???
Если да, то где нужно вписать путь к файлу, который требуется сжать?
Допустим мне надо сжать bmp-картинку, которая находится С:\Мои документы\машинка.bmp
Гляньте код - это сжатие файла алгоритмом 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;
}
}