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

📄 titlesdlg.cpp

📁 一个检索单个汉字、多个汉字和词组
💻 CPP
字号:
// TitlesDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestCorpus.h"
#include "TitlesDlg.h"
#include "retrieval.h"
#include "GetDataDlg.h"
#include <afxwin.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

# define HZ_ID(c1,c2) ((c1)-176) *94 +((c2)-161)

extern CString corpusName;
extern CStringArray texts;
extern CHzInfo hzInfo[6768];
extern BOOL CorpusModified;
extern void AddAFile(CString FileName);

extern CTitlesDlg BrowseCorpusDlg;


/////////////////////////////////////////////////////////////////////////////
// CTitlesDlg dialog


CTitlesDlg::CTitlesDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTitlesDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTitlesDlg)
	//}}AFX_DATA_INIT
}


void CTitlesDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTitlesDlg)
	DDX_Control(pDX, IDC_File_List, tlist);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTitlesDlg, CDialog)
	//{{AFX_MSG_MAP(CTitlesDlg)
	ON_BN_CLICKED(IDTEXTContent, OnTEXTContent)
	ON_BN_CLICKED(IDC_Remove_Text, OnRemoveText)
	ON_BN_CLICKED(IDC_Add_Files, OnAddFiles)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTitlesDlg message handlers


BOOL CTitlesDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	if(corpusName.IsEmpty())
		return TRUE;
	this->SetWindowText("当前语料库: "+corpusName);
	CString s,id;
	int k=0;
	for(int i=0;i<texts.GetSize();i++) {
		s=texts[i];
		int j=s.ReverseFind('\\');
		if(j>0)
			s=s.Mid(j+1); // 去掉路径名,以免浏览时显示文件名太长
		k=i+1; // 最小序号为1,依次排号,因此显示序号比数组下标数字大1
		id.Format("%5d",k); // 将序号设为5位数显示
		s=id+":"+s;
		tlist.AddString(s); // 加到列表框中
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CTitlesDlg::OnTEXTContent() 
{
	// TODO: Add your control notification handler code here
	int i=tlist.GetCurSel();
	if(i==LB_ERR)
		return;
	CString s;
	tlist.GetText(i,s);
	i=s.ReverseFind(':');
	s=s.Mid(0,i);
	i=atoi(s)-1; // 数组下标从0开始计数,因此比实际显示的数字小1
	AfxGetApp()->OpenDocumentFile(texts[i]); // 打开语料文件,在Win9x环境下,不能打开64K以上文件
}

void CTitlesDlg::OnRemoveText() 
{ // 一次只能删除一个文件
	// TODO: Add your control notification handler code here
	int i=tlist.GetCurSel();
	
	if(i==LB_ERR)
		return;
	CString s;
	tlist.GetText(i,s);
	tlist.DeleteString(i);
	
	i=s.ReverseFind(':');
	s=s.Mid(0,i); // 获取该文件在texts数组中的下标序号
	i=atoi(s)-1; // 数组下标从0开始计数,因此比实际显示的数字小1

	// 移去跟待删除文件相关的汉字信息:包括次数,文件地址等
	FILE * in;
	in=fopen((const char *)texts[i],"rb");
	if(!in) {
		AfxMessageBox("文件"+texts[i]+"不存在!");
		return;
	}

	while(!feof(in)) {
		unsigned char c1,c2;
		c1=(unsigned char)fgetc(in);
		if(c1<128 || c1==255) // 255表示到文件尾之前,可以结束了
			continue;
		c2=(unsigned char)fgetc(in);
		if(c1>=176) {
			int id=HZ_ID(c1,c2);
			if(id<0||id>=6768)
				continue;

			hzInfo[id].Count--; //  将该汉字出现次数减一

			if(!hzInfo[id].TextIDModified) {
				CWordArray * txtID;
				txtID=&(hzInfo[id].TextID);
				int ww=txtID->GetSize(); // 看一个汉字出现在几个文件中,ww是文件数
				int ss=0;
				for(int dd=0;dd<ww;dd++) {
					ss=txtID->GetAt(dd); // 取出这个汉字所在文件的序号,即texts数组下标
					if(ss==i) // 如果刚好是当前被删除文件
						break;
				}

				ww=ww-1; // 取数组最后一个元素的下标

				if(ww<0) 
					return;
				else { 
					while(ww>dd){ // 从当前待删除文件开始,将标号依次后移,也就是将文件序号依次减小一个
						hzInfo[id].TextID[ww]=hzInfo[id].TextID[ww-1]; // 原TextID[ww]应该比原TextID[ww-1]大1
						ww--;
					}
					if(dd<hzInfo[id].TextID.GetSize()) {
						hzInfo[id].TextID.RemoveAt(dd);
						hzInfo[id].TextIDModified=TRUE;
					}
				}
			}
		}
	}

	fclose(in);
	texts.RemoveAt(i); // 从动态数组中删除语料文件名

	for(int kk=0;kk<6768;kk++) { 
		CWordArray * txtID;
		txtID=&(hzInfo[kk].TextID);
		int xx=0; // 以下对那些此次删除文件没有涉及到的汉字进行处理
		if ((!hzInfo[kk].TextIDModified) && hzInfo[kk].Count>0) {
			xx=txtID->GetSize();
			int aa=0,bb=0;
			for(bb;bb<xx;bb++) {
				aa=txtID->GetAt(bb); // 取出这个汉字所在文件的序号,即texts数组下标
				if(aa>i) // 当前汉字所在的文件序号大于被删除文件的序号,需要改变相应的序号值 --1
					break;
			}
			xx=xx-1; // 取包含当前汉字的文件数
			while(xx>=bb){ // 从最后一个文件序号开始,依次将序号减一,一直减到文件序号等于被删除文件序号为止
				if(hzInfo[kk].TextID[xx]>=1)
					hzInfo[kk].TextID[xx]=hzInfo[kk].TextID[xx]-1;
				xx--;
			}			
		}
		hzInfo[kk].TextIDModified=FALSE; // 将汉字信息数组地址的修改状态重新置为0
	}

	CorpusModified=TRUE; // 语料库修改标记置为1
	
	OnOK(); // 删除语料文件后先关闭原来的对话框,调用CTitleDlg自己的成员函数OnOK()
	BrowseCorpusDlg.Create(IDD_Browse_Corpus_Files);// 重新打开一个新的对话框,对语料库中的文件重新进行排序
}

void CTitlesDlg::OnAddFiles() 
{// 向语料库中增加原始文件
	// TODO: Add your control notification handler code here
	if(corpusName.IsEmpty()||texts.GetSize()==65535)
		return;
	ProcessFiles("txt","*.txt",AddAFile);

	OnOK(); // 增加语料后先关闭原来的对话框
	BrowseCorpusDlg.Create(IDD_Browse_Corpus_Files);// 重新打开一个新的对话框,包含新增加的语料
}

void CTitlesDlg::OnOK() 
{// 重载CDialog的OnOK函数
	// TODO: Add extra validation here
	CDialog::OnOK();
	DestroyWindow(); // 释放Create函数产生的对话框资源
}

void CTitlesDlg::OnCancel()
{// 重载CDialog的OnCancel函数
	CDialog::OnCancel();
	DestroyWindow(); // 释放Create函数产生的对话框资源
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -