constintcodes=4096;constintByteSize=8;constintexcess=4;constintalpha=256;constintmask=15;unsignedchars[codes];intsize;intleftOver;intstatus=0;classelement{public:intprefix;unsignedcharsuffix;elementoperator=(elemente){prefix=e.prefix;suffix=e.suffix;}};elementh[codes];FILE*in;FILE*out;voidsetFiles(){charinPutFile[100];charoutPutFile[100];chartemp[20];strcpy(inPutFile,D:\\);strcpy(outPutFile,D:\\);coutinputnameoffiletodecompress(Omittheextension.zzz);cintemp;strcat(inPutFile,temp);strcat(outPutFile,temp);/*coutinputformatofdecompressedfile;cintemp;if(!strchr(inPutFile,temp)){strcat(outPutFile,.);strcat(outPutFile,temp);}*/strcat(inPutFile,.zzz);if((in=fopen(inPutFile,rb))==NULL){cerrcannotopeninPutFile;exit(1);}out=fopen(outPutFile,wb);}
voidoutPut(intcode){size=-1;while(code=alpha){s[++size]=h[code].suffix;code=h[code].prefix;}s[++size]=h[code].suffix;for(inti=size;i=0;i--){fputc(s[size],out);}}boolgetCode(intcode){unsignedcharc,d;c=fgetc(in);if(feof(in))returnfalse;if(status){code=(leftOverByteSize)|c;}else{d=fgetc(in);code=(cexcess)|(dexcess);leftOver=dmask;//problem?}status=1-status;returntrue;}
voiddeCompress(){intused=alpha;intpcode;intccode;if(getCode(pcode)){s[0]=pcode;fputc(s[0],out);size=0;while(getCode(ccode)){if(ccodeused){outPut(ccode);if(usedcodes){h[used].prefix=pcode;h[used++].suffix=s[size];}}else{h[used].prefix=pcode;h[used++].suffix=s[size];outPut(ccode);}pcode=ccode;}}fclose(in);fclose(out);} |