⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 haffmandoc.cpp

📁 这个也是哈夫曼编码译码      这个是基于文档类的
💻 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 + -