# include & ltstring.h & gt
# include & ltstdlib.h & gt
# include & ltconio.h & gt
구조 헤드
{
부호 없는 문자 b; /* 문자 */
긴 카운트 /* 주파수 */
Long parent, lch, rch/* 나무 만들기 */
문자 비트 [256]; /* 허프만 코드 */
}
헤더 [5 12], tmp
잘못된 압축 ()
{
Char 파일 이름 [255], 출력 파일 [255], buf [512];
부호 없는 문자 c;
롱 I, j, m, n, f;
드래곤 맨1,pt 1, flength
파일 * ifp, * ofp
Printf ("소스 파일 이름:");
가져오기 (파일 이름);
Ifp=fopen (파일 이름, "Rb");
If(ifp==NULL)
{
Printf ("소스 파일 열기 오류! \ n ");
반환;
}
Printf ("대상 파일 이름:");
가져오기 (output file);
Ofp = fopen (출력 파일, "WB");
If(ofp==NULL)
{
Printf ("대상 파일 열기 오류! \ n ");
반환;
}
F length = 0;;
그리고 (! 외국인 투자자 협회
{
프레드 (& ampc, 1, 1, ifp);
제목 [c]. Count++;+;
Flength++;
}
F length-;
제목 [c]. Count-;
For(I = 0;; 나<5 12; I++)
{
If (헤더 [I]. 세어! =0) 머리 [i]. B= (부호 없는 문자) I;
Else 헤더 [i]. B = 0;;
제목 [i]. Parent =-1;
제목 [i]. Lch = 헤더 [I] 입니다. Rch =-1;
}
For(I = 0;; 나 & lt256; I++)
{
For (j = I+1; J & lt256; J++)
{
If (헤더 [I]. 수< 제목 [j]. 수)
{
Tmp = 헤더 [I];
머리 [I]= 머리 [j];
헤더 [j] = tmp;
}
}
}
For(I = 0;; 나 & lt256; I++) if (헤더 [I]. Count = = 0)break;;
N = I;;
M = 2 * n-1;
For(I = n;; 나 & ltm;; I++)
{
Min1= 99999999;
For(j = 0;; J< 나; J++)
{
If (머리 [j]. 부모! =- 1) 계속;
If (min1> 제목 [j]. 수)
{
Pt1= j;
Min1= 헤드 [j]. 셀 수 있습니다.
계속;
}
}
제목 [i]. Count=header[pt 1]. 셀 수 있습니다.
제목 [pt 1]. Parent = I;;
제목 [i]. Lch = pt1;
Min1= 99999999;
For(j = 0;; J< 나; J++)
{
If (머리 [j]. 부모! =- 1) 계속;
If (min1> 제목 [j]. 수)
{
Pt1= j;
Min1= 헤드 [j]. 셀 수 있습니다.
계속;
}
}
제목 [i]. Count+=header[pt 1]. 셀 수 있습니다.
제목 [i]. Rch = pt1;
제목 [pt 1]. Parent = I;;
}
For(I = 0;; 나 & ltn;; I++)
{
F = I;;
제목 [i]. 비트 [0] = 0;
While (제목 [f]. 부모! =- 1)
{
J = f;;
F = 제목 [f]. 부모;
If (제목 [f].lch==j)
{
J = strlen (헤더 [I]. 비트);
Memmove (헤더 [i]. 비트+1, 제목 [I]. 비트, j+1);
제목 [i]. 비트 [0] = "0";
}
기타
{
J = strlen (헤더 [I]. 비트);
Memmove (헤더 [i]. 비트+1, 제목 [I]. 비트, j+1);
제목 [i]. 비트 [0] ='1';
}
}
}
Fseek(ifp, 0, seek _ set);
Fwrite(& amp;; Flength, sizeof(int), 1, ofp);
Fseek(ofp, 8, seek _ set);
Buf [0] = 0;
F = 0;;
Pt1= 8;
그리고 (! 외국인 투자자 협회
{
C = fgetc (ifp);
F++;+;
For(I = 0;; 나 & ltn;; I++)
{
If(c==header[i]. B) 파괴
}
Strcat(buf, header[i]. 비트);
J = 스트렌 (buf);
C = 0;;
While(j & gt;; =8)
{
For(I = 0;; 나<8; I++)
{
If (buf [I] = ='1') c = (c < & lt 1)| 1;
Else c = c<& lt 1;
}
Fwrite(& amp;; C, 1, 1, ofp);
Pt1++;
Strcpy(buf, buf+8);
J = 스트렌 (buf);
}
If (f = = f length) break;
}
If(j & gt;; 0)
{
Strcat(buf, "00000000");
For(I = 0;; 나<8; I++)
{
If (buf [I] = ='1') c = (c < & lt 1)| 1;
Else c = c<& lt 1;
}
Fwrite(& amp;; C, 1, 1, ofp);
Pt1++;
}
Fseek(ofp, 4, seek _ set);
Fwrite(& amp;; Pt 1, sizeof(long), 1, ofp);
Fseek(ofp, pt 1, seek _ set);
Fwrite(& amp;; N, sizeof(long), 1, ofp);
For(I = 0;; 나 & ltn;; I++)
{
Fwrite(& amp;; (제목 [i]. B), 1, 1, ofp);
C = strlen (헤더 [I]. 비트);
Fwrite(& amp;; C, 1, 1, ofp);
J = strlen (헤더 [I]. 비트);
If(j%8! =0)
{
For(f = j% 8;; F<8; F++)
Strcat (헤드 [I]. 비트, "0");
}
While (헤더 [I]. 비트 [0]! =0)
{
C = 0;;
For(j = 0;; J<8; J++)
{
If (헤더 [I]. Bits [j] = ='1') c = (c < & lt 1)| 1;
Else c = c<& lt 1;
}
Strcpy (헤더 [i]. 비트, 제목 [I]. 비트+8);
Fwrite(& amp;; C, 1, 1, ofp);
}
}
Fclose (ifp);
Fclose (ofp);
Printf ("압축 성공! \ n ");
반환;
}
Void 압축 해제 ()
{
Char 파일 이름 [255], 출력 파일 [255], buf[255], bx [255];
부호 없는 문자 c;
롱 I, j, m, n, f, p, l;
긴 섬유 길이
파일 * ifp, * ofp
Printf ("소스 파일 이름:");
가져오기 (파일 이름);
Ifp=fopen (파일 이름, "Rb");
If(ifp==NULL)
{
Printf ("소스 파일 열기 오류! \ n ");
반환;
}
Printf ("대상 파일 이름:");
가져오기 (output file);
Ofp = fopen (출력 파일, "WB");
If(ofp==NULL)
{
Printf ("대상 파일 열기 오류! \ n ");
반환;
}
프레드 (& ampflength, sizeof(long), 1, ifp);
프레드 (& ampf, sizeof(long), 1, ifp);
Fseek(ifp, f, seek _ set);
프레드 (& ampn, sizeof(long), 1, ifp);
For(I = 0;; 나 & ltn;; I++)
{
프레드 (& 제목 [i]. B, 1, 1, ifp);
프레드 (& ampc, 1, 1, ifp);
P = (long) c;
제목 [i]. Count = p;;
제목 [i]. 비트 [0] = 0;
If(p% 8>;; 0) m = p/8+1;
Else m = p/8;
For(j = 0;; J & ltm;; J++)
{
프레드 (& ampc, 1, 1, ifp);
F = c;;
이타 (f, 부, 2);
F = strlen (buf);
For(l = 8;; L & gtf;; L-)
{
Strcat (헤드 [I]. 비트, "0");
}
Strcat (헤더 [I]. bits, buf);
}
제목 [i]. 비트 [p] = 0;
}
For(I = 0;; 나 & ltn;; I++)
{
For (j = I+1; J & ltn;; J++)
{
If (strlen (헤더 [I]. 비트) >; Strlen (헤더 [j]. 비트))
{
Tmp = 헤더 [I];
머리 [I]= 머리 [j];
헤더 [j] = tmp;
}
}
}
P = strlen (헤더 [n-1]). 비트);
Fseek(ifp, 8, seek _ set);
M = 0;;
Bx [0] = 0;
While( 1)
{
While (strlen (bx) < (부호 없는 정수) p)
{
프레드 (& ampc, 1, 1, ifp);
F = c;;
이타 (f, 부, 2);
F = strlen (buf);
For(l = 8;; L & gtf;; L-)
{
Strcat(bx, "0");
}
Strcat(bx, buf);
}
For(I = 0;; 나 & ltn;; I++)
{
If (memcmp (헤더 [i]. 비트, bx, 제목 [I]. Count) = = 0) break;
}
Strcpy(bx, bx+header[i]. 개수);
C = 제목 [i]. B;
Fwrite(& amp;; C, 1, 1, ofp);
M++;+;
If (m = = f length) break;
}
Fclose (ifp);
Fclose (ofp);
Printf ("압축을 풀었습니다! \ n ");
반환;
}
Int main ()
{
Int c;;
Printf(" 1-압축 파일 \ n ");
Printf("2-파일 압축 해제 \ n ");
Printf("Select 1 또는 2: ");
C = getch ();
Printf("%c\n ",c);
If (c = ='1') compress ();
Else if(c = =' 2 ')uncompress(); ();
0 을 반환합니다
}