Red de conocimiento informático - Computadora portátil - Código fuente del programa de codificación Huffman adaptativo en C.

Código fuente del programa de codificación Huffman adaptativo en C.

# incluir ltstdio.h gt

# incluir ltstring.h gt

# incluir ltstdlib.h gt

# incluir ltconio.h gt

Encabezado de estructura

{

Carácter sin firmar b;

Cuenta larga;

padre largo, lch, rch

Bits de carácter [256];

}

Encabezado [512], tmp

Compresión no válida ()

{

nombre de archivo char[255], archivo de salida[255], buf[512];

carácter sin signo c;

long i, j, m, n, f;

long min1, pt1, length

FILE *ifp, * ofp

Printf ("Nombre del archivo fuente (en el directorio actual): ")

Obtener (nombre de archivo);

ifp=fopen (nombre de archivo, "Rb"); >

{

printf("¡Error! \ n ");

Regresar

}

Printf ("Generar; nombre de archivo:");

Obtener (archivo de salida);

ofp=fopen(archivo de salida, "WB");

if(ofp ==NULL )

{

printf("¡Error! \ n ");

Devolver

}

f longitud = 0;

mientras(!asociación de inversores extranjeros

{

fred(ampc,1,1,ifp);

Título[c];

f longitud;

}

f longitud-;

encabezado[c].count-;

for(I = 0;ilt512;i)

{

if(encabezado[i].count ! =0) encabezado[i]. =(carácter sin firmar)I;

else encabezado[i].

encabezado[i].

lch=encabezado[i].rch=. -1;

}

for(I = 0; ilt256; i )

{

for(j = I 1; j lt256; j )

{

if(encabezado[i] . Cuente ltTítulo[j]. recuento)

{

tmp = encabezado[I];

Encabezado[I]=encabezado[j];

encabezado[ j]= tmp;

}

}

}

for(I = 0;ilt256;i) if(encabezado [ i].

contar = = 0)romper;

n = I;

m = 2 * n-1;

for(I = n;iltm;i )

{

min 1 = 99999999;

for(j = 0; j lt i; j )

{

if(head[j].parent!=-1)continue;

if(min 1 gt;title[j].count)

{

pt 1 = j;

min1=encabezado[j]. Contar;

Continuar;

}

}

Título [i]. recuento=encabezado[pt1]. Recuento;

Título[pt1]. padre = I;

Título[i]. lch = pt 1;

min 1 = 99999999;

for(j = 0;j lti;j)

{

if(head[j].parent!=-1)continue;

if(min 1 gt;title[j].count)

{

pt 1 = j;

min1=encabezado[j]. Contar;

Continuar;

}

}

Título [i]. recuento =encabezado[pt1]. Recuento;

Título[i]. rch = pt 1;

Título[pt1]. padre = I;

}

for(I = 0;iltn;i)

{

f = I;< / p>

Título[i]. Bit[0]=0;

mientras(título[f].Parent!=-1)

{

j = f;

f = título[f]. Padre;

if(header[f].lch==j)

{

j=strlen(header[i].bit);

p>

memmove(encabezado[i].bit 1, título[i].bit,j 1);

encabezado[i]. bit[0]="0";

}

Otro

{

j=strlen(encabezado[i].bit );

memmove(encabezado[i].bit 1, título[i].bit,j 1);

encabezado[i]. bit[0]= ' 1 ';

}

}

}

fseek(ifp, 0, SEEK_SET) ;

fwrite(amp;flength,sizeof(int),1,ofp);

fseek(ofp,8,SEEK_SET);

buf [0]= 0;

f = 0;

pt 1 = 8;

Y (! Asociación de Inversores Extranjeros

{

c = fgetc(ifp);

f ;

for(I = 0; iltn; i )

{

if(c==encabezado[i].

b) Romper;

}

strcat(buf, encabezado[i].bit

j = strlen(buf); p>c = 0;

mientras(j gt;=8)

{

for(I = 0;ilt8;i)

{

if(buf[I]= = ' 1 ')c =(c lt; lt1)|1;

si no c = c lt lt1;

p>

}

fwrite( amp; c, 1, 1, ofp);

pt 1;

strcpy(buf, buf 8 ) ;

j = strlen(buf);

}

if(f = = f longitud)break;

}< / p>

if(j gt; 0)

{

strcat(buf, " 00000000 ");

for(I = 0; i lt8;i)

{

if(buf[I]= = ' 1 ')c =(c lt; lt1)|1;

else c = c lt lt1;

}

fwrite( amp; c, 1, 1, ofp);

pt 1; >}

fseek(ofp, 4, SEEK _ SET);

fwrite( amp; pt1, tamaño de (largo), 1,

); fseek(ofp,pt1,SEEK_SET);

fwrite(amp;n,sizeof(long),1,ofp);

for(I = 0;i ltn ;i )

{

fwrite( amp; (título[i].b),1,1,ofp);

c=strlen(encabezado [i] .bit);

fwrite(amp;c,1,1,ofp);

j=strlen(header[i].bit);

if(j8!=0)

{

for(f = j 8; f lt8; f )

strcat(header[i] .bit, "0");

}

mientras(encabezado[i]. bit[0]! =0)

{

c = 0;

for(j = 0; j lt8; j )

{

if(encabezado[i].bits[j]= = ' 1 ')c =(c lt; lt1)|1;

else c = c lt lt1;

}

strcpy(encabezado[i]. bit, encabezado[i].

bit 8);

fwrite(amp;c,1,1,ofp);

}

}

fclose(ifp

fclose(ofp);

Printf("Compresión completa\ n ");

}

descompresión vacía ()

{

nombre de archivo char[255], archivo de salida[255], buf[255], bx[255];

carácter sin signo c

p>

longitud i, j, m, n, f, p, l;

Longitud de fibra larga

ARCHIVO *ifp, *ofp

Printf("Nombre del archivo fuente (en el directorio actual):");

Obtener (nombre del archivo);

ifp=fopen(nombre del archivo, "Rb") ;

if(ifp==NULL)

{

printf("¡Error!\ n ");

Regresar;

}

Printf("Generar nombre de archivo: ");

Obtener (archivo de salida);

ofp=fopen(archivo de salida, "WB); ");

if(ofp==NULL)

{

printf("¡Error!\n ");

regresar

}

fred(ampflength,tamañode(largo),1,ifp);

fred(ampf,tamañode(largo) ), 1, ifp; );

fseek(ifp, f, SEEK_SET);

fred(ampn, sizeof(long), 1, ifp);

p>

for(I = 0;iltn;i)

{

fred(amp título[i].b,1,1,ifp

); fred(ampc,1,1,ifp);

p = (long)c;

Título[i]. cuenta = p;

Título[i]. bit[0]=0;

si(p 8 gt; 0)m = p/8 1;

si no m = p/8;

for(j = 0; j ltm; j )

{

fred(ampc,1,1,ifp);

f = c

itoa(f,buf,2);

f = strlen(buf);

for(l = 8;l gtf;l -)

{

strcat(encabezado[i].bit, "0");

}

strcat(encabezado[i]. bits, buf);

}

Título[i].

Bit[p] = 0;

}

para(I = 0; i ltn; i )

{

para( j = I 1; j ltn; j )

{

if(strlen(encabezado[i].bit)>;strlen(encabezado[j].bit))

{

tmp = encabezado[I];

Encabezado[I]=encabezado[j];

encabezado[j]= tmp ;

}

}

}

p=strlen(encabezado[n-1]). bit);

fseek(ifp, 8, SEEK _ SET);

m = 0;

bx[0] = 0;

mientras(1)

{

mientras(strlen(bx) lt; (entero sin signo)p)

{

fred(ampc,1,1,ifp);

f = c;

itoa(f,buf,2);

f = strlen( buf);

for(l = 8; l gtf; l -)

{

strcat(bx, " 0 ");

}

strcat(bx,buf);

}

for(I = 0;iltn;i)

{

if(memcmp(encabezado[i].bit,bx,encabezado[i].count)== 0)break;

}

strcpy (bx, bx encabezado[i].count);

c = encabezado[i]. b;

fwrite(amp;c,1,1,ofp);

m;

if(m = = f longitud)break;

p>

}

fclose(ifp);

fclose(ofp);

Printf("¡Decodificando correctamente!\n ");

fclose(ofp); p>

}

int main()

{

int c;

while (1) {

Printf("Presione 1 para seleccionar codificación\n ");

Printf("Presione 2 para seleccionar decodificación\n" );

Printf("Por favor seleccione 1 o 2: ");

c = getch()

printf("c\n ",c

if(c == ' 1 ' )comprimir();

si no (c = = ' 2 ')descomprimir();

}

Devuelve 0;

}