📄 titlesdlg.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 + -