📄 haffmandoc.cpp
字号:
// HaffmanDoc.cpp : implementation of the CHaffmanDoc class
//
#include "string.h"
#include "stdafx.h"
#include "Haffman.h"
#include "HaffmanDoc.h"
#include "list.h"
#include "HelpD.h"
#include "HaffmanView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHaffmanDoc
IMPLEMENT_DYNCREATE(CHaffmanDoc, CDocument)
BEGIN_MESSAGE_MAP(CHaffmanDoc, CDocument)
//{{AFX_MSG_MAP(CHaffmanDoc)
ON_COMMAND(IDM_CODE, OnCode)
ON_COMMAND(IDM_UNCODE, OnUncode)
ON_COMMAND(IDM_OTHER, OnOther)
ON_COMMAND(IDD_HELPD, OnHelpd)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHaffmanDoc construction/destruction
CHaffmanDoc::CHaffmanDoc()
{
// TODO: add one-time construction code here
}
CHaffmanDoc::~CHaffmanDoc()
{
DeleteFile("MyDoc.txt");
}
BOOL CHaffmanDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CHaffmanDoc serialization
void CHaffmanDoc::Serialize(CArchive& ar)
{
CString ss2[2], text = "";
char pp[6] = "" ;
// CEditView contains an edit control which handles all serialization
if(ar.IsStoring())
{
((CEditView*)m_viewList.GetHead())->GetWindowText(text);
ar<<text;
ar<<m<<m_count;
for(int i = 1; i<=2*m-1; i++)
{
if(i<=m)
{
ar<<ss[i];
}
ar<<HT[i].id<<HT[i].lchild<<HT[i].rchild<<HT[i].parent<<HT[i].weight;
}
}
else
{
ar>>text;
ar>>m>>m_count;
for( int i = 1; i<=2*m-1; i++)
{
if(i<=m)
{
ar>>ss[i];
}
ar>>HT[i].id>>HT[i].lchild>>HT[i].rchild>>HT[i].parent>>HT[i].weight;
}
((CEditView*)m_viewList.GetHead())->SetWindowText(text);
}
}
/////////////////////////////////////////////////////////////////////////////
// CHaffmanDoc diagnostics
#ifdef _DEBUG
void CHaffmanDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CHaffmanDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHaffmanDoc commands
void CHaffmanDoc::OnCode()
{
AfxGetApp()->BeginWaitCursor();
((CEditView*)m_viewList.GetHead())->GetWindowText(m_input);
if(strlen(m_input)<2)
{
MessageBox(NULL,"无法编码!","编码",MB_OK) ;
return;
}
else if( m_count !=2)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
pMenu->EnableMenuItem(IDM_CODE,MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(IDM_UNCODE,MF_ENABLED);
m_count = 2;
int i = 0, j = 0, k, n, s1, s2;
char * cd ;
CString s = "";
m = 0;
for( i = 0; i<512; ++i)
{
HT[i].lchild = 0;
HT[i].id = 0;
HT[i].parent = 0;
HT[i].rchild = 0;
HT[i].weight = 0;
}
for(i=0; i<=256; i++)
{ w[i].id = i; w[i].date=0; }
for( i=0; i<strlen(m_input); ++i)
{
n = (int)m_input[i];
w[n].date++;
}
for(i=0; i<=256;i++)
{
if(w[i].date!=0) m++;
}
for( i = 1; i<=m; ++i)
{
while(j<256 && w[j].date==0){ j++;}
HT[i].weight = w[j].date;
HT[i].id = j;
HT[i].lchild = 0;
HT[i].rchild = 0;
HT[i].parent = 0;
j++;
}
for(i=m+1; i<=2*m-1; ++i)
{
j=1;
while(j<i&&HT[j].parent!=0){ j++; }
s1 = j; j++;
while(j<i&&HT[j].parent!=0){ j++; }
s2 = j;
for( k = ++j; k<i; k++)
{
if(HT[k].parent==0)
{
if(HT[s2].weight>=HT[s1].weight)
{
if(HT[k].weight<HT[s1].weight){ s1 = s2 ; s2 = k; }
else if(HT[k].weight<HT[s2].weight&&HT[k].weight>=HT[s1].weight) s2 = k;
}
else if(HT[k].weight<HT[s1].weight){ s1 = s2 ; s2 = k; }
}
}
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HaffmanCode)malloc((m+1) * sizeof(char*));
cd = (char*)malloc(m * sizeof(char));
cd[m-1] = '\0';
for(i = 1; i<=m; ++i)
{
int start = m -1;
int c, f;
for( c=i, f=HT[i].parent; f!=0; c=f,f=HT[f].parent)
if(HT[f].lchild==c) cd[--start]='0';
else cd[--start] = '1';
HC[i] = (char*)malloc((m-start)*sizeof(char));
strcpy(HC[i], &cd[start]);
ss[i] = HC[i];
}
for( i=0 ; i<strlen(m_input); ++i)
{ j=1;
n = (int)m_input[i];
k = HT[j].id;
for(; k!=n&&j<m; ) { j++; k = HT[j].id; }
s = s + HC[j] ;
}
((CEditView*)m_viewList.GetHead())->SetWindowText(s);
((CEditView*)m_viewList.GetHead())->SendMessage(WM_SHOW,0,0);
}
AfxGetApp()->EndWaitCursor();
}
void CHaffmanDoc::OnUncode()
{
// TODO: Add your command handler code here
AfxGetApp()->BeginWaitCursor();
((CEditView*)m_viewList.GetHead())->GetWindowText(m_input);
if(strlen(m_input)==0)
{
MessageBox(NULL,"无法译码!","译码",0) ;
return;
}
if(m_count == 2)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
pMenu->EnableMenuItem(IDM_UNCODE,MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(IDM_CODE,MF_ENABLED);
m_count = 1;
int f = 2*m - 1 , i = 0;
CString s = "";
char ss[2];
ss[0] = ' ';
ss[1] = '\0';
while(i<strlen(m_input))
{
if(m_input[i] == '0') f = HT[f].lchild;
else if(m_input[i] == '1') f = HT[f].rchild;
else
{
MessageBox(NULL,"含非法字符!","译码",0);
return;
}
if(HT[f].rchild==0 && HT[f].lchild==0)
{
ss[0] = (char)HT[f].id;
s = s + ss;
f = 2*m - 1;
}
i++;
}
((CEditView*)m_viewList.GetHead())->SetWindowText(s);
}
else MessageBox(NULL,"译码己结束!","译码",0);
AfxGetApp()->EndWaitCursor();
}
void CHaffmanDoc::OnOther()
{
// TODO: Add your command handler code here
char szFilter[] = "文本文件(*.txt)|*.*|All Files(*.*)|*.*||";
CFile cf;
CString text;
char r[1000]= " ";
CFileDialog dlg(TRUE,"文本",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,0);
dlg.m_ofn.lpstrInitialDir = "C:\\";
if( dlg.DoModal() == IDOK)
{
CString path = dlg.GetPathName();
if(cf.Open(path, CFile::modeRead))
cf.Read( r, 1000);
text = r;
((CEditView*)m_viewList.GetHead())->SetWindowText(text);
}
m_count = 1;
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
pMenu->EnableMenuItem(IDM_UNCODE,MF_DISABLED|MF_GRAYED);
pMenu->EnableMenuItem(IDM_CODE,MF_ENABLED);
}
void CHaffmanDoc::OnHelpd()
{
// TODO: Add your command handler code here
CHelpD ch;
ch.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -