این کد رو استادمون به عنوان نمونه نوشته درستی یا غلط بودنش گردن خودش
// This is a sample program by 'Arash Ostadzadeh' intended as a
// solution for Ex #5-'Simplified Huffman Coding'
// <notes for students>
// review each section carefully and try to understand its function.
// remember there is often a simple solution to problems, you just
// have to find it! so take your time when encountering one.
// certainly 'Programming is an ART'. try to develop your art of computer
// programming by excessive effort.
// for example in this problem in order to get rid of the complexity
// of manipulating bits directly, I have used a temporary file with
// each character (byte) representing a bit of '0' or '1' and then
// converted the temp file to the real output.
// one more thing: I have put a small bug in this program intentionally
// which doesn't affect the overall functionality of the program.
// the first student who will report that bug will get a bonus for
// his/her midterm exam.
// goodluck.
#include <stdio.h>
#include <iostream.h>
#include <alloc.h>
typedef struct // structure outline to keep track of unique symbols in file
{
char symbol;
int rep;
} table;
unsigned char power_2(int);
void sorttable(table *, int);
void writetotempfile(int, int, FILE *, unsigned long *);
void converttemptohuff(FILE *, FILE *);
void main(int argc, char **argv)
{
table *stb;
int syms,inputsize,counter;
unsigned long outputsize;
char inchar;
FILE *in,*out;
if (argc!=3) { cout<<"invalid number of parameters"; return;}
if ( !(in=fopen(argv[1],"rb")) )
{ cout<<"can not open input file"; return;}
if ( !(out=fopen("temp.huf","wb")) )
{ cout<<"can not create temp file"; return;}
if( !(stb=(table *)malloc(sizeof(table)*255)) )
{ cout<<"error in memory allocation"; return;}
syms=inputsize=outputsize=0;
inchar=fgetc(in);
while ( !feof(in) ) // make the symbols table from input file
{
for (counter=0;counter<syms;counter++)
if (inchar==stb[counter].symbol) { stb[counter].rep++; break; }
if ( counter==syms )
{
stb[counter].symbol=inchar;
stb[counter].rep=1;
syms++;
}
inputsize++;
inchar=fgetc(in);
}
stb=(table *)realloc(stb,syms*sizeof(table));
sorttable(stb,syms); // sort the table in descending order
// of the number of occurances for each symbol
fseek(in,0,SEEK_SET);
inchar=fgetc(in);
while ( !feof(in) ) // make the temporary file
{
for(counter=0;counter<syms;counter++)
if ( inchar==stb[counter].symbol )
{
writetotempfile(counter,syms,out,&outputsize);
break;
}
inchar=fgetc(in);
}
outputsize/=8; outputsize+=syms+3; // adjast the "outputsize" 'cos every
// 8 characters in temp file is equal
// to a byte in real output file.
// for the last incomplete byte we have
// to count it as 1 also.
// 3=1(incomplete byte)+2(leading bytes)
fclose(in);fclose(out);
if ( !(in=fopen("temp.huf","rb")) ) // change the roles of opened files!
{ cout<<"can not open temp file"; return;}
if ( !(out=fopen(argv[2],"wb")) )
{ cout<<"can not create output file"; return;}
fputc(char(inputsize),out); // write leading info in output file
fputc(char(syms),out);
for (counter=0;counter<syms;counter++) fputc(stb[counter].symbol,out);
converttemptohuff(in,out);
fclose(in);fclose(out);
cout<<"compression ratio = "<<(int)(outputsize/(float)inputsize*100)<<" %";
} // end of main()
void converttemptohuff(FILE *input, FILE *output)
{
unsigned char otmp=0,itmp;
int pos=7;
itmp=fgetc(input);
while( !feof(input) )
{
if (itmp=='1')
otmp=otmp | power_2(pos);
itmp=fgetc(input);
if (pos==0)
{
fputc(otmp,output);
pos=7;
otmp=0;
continue;
}
pos--;
}
if ( pos!=7 ) fputc(otmp,output);
}
void writetotempfile(int no_zeros, int no_syms, FILE*tmp, unsigned long *osize)
{
int i=0;
for ( ;i<no_zeros;i++) fputc('0',tmp);
(*osize)+=no_zeros;
if ( no_zeros<no_syms-1 || no_syms==1 )
{ fputc('1',tmp); (*osize)++; }
}
void sorttable(table *t, int size)
{
table temp;
int i,j;
for(i=size-1;i>0;i--)
for (j=0;j<i;j++)
if ( t[j].rep<t[j+1].rep)
{ temp=t[j]; t[j]=t[j+1]; t[j+1]=temp; }
}
unsigned char power_2(int n)
{
unsigned char c,res=1;
for (c=0;c<n;C++) res<<=1;
return res;
}
http://ostadzadeh.mshdiau.ac.ir/adv_...ode%20examples