📄 dlgcreate.cpp
字号:
// DlgCreate.cpp : implementation file
//
#include "stdafx.h"
#include "hownet.h"
#include "DlgCreate.h"
#include "io.h" //其中定义了函数access()
#include "shlobj.h" //其中有文件夹信息的有关定义
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_LEN 10000
// 定义《知网》文本词典的每条记录各个字段的最大长度
#define MAX_NUMBER_LEN 8
#define MAX_CWORD_LEN 40
#define MAX_CTYPE_LEN 8
#define MAX_CEXAM_LEN 150
#define MAX_EWORD_LEN 140
#define MAX_ETYPE_LEN 8
#define MAX_EEXAM_LEN 20
#define MAX_DEF_LEN 130
// 定义《知网》文本词典的词目记录
struct DICTIONARY
{
char NUMBER[MAX_NUMBER_LEN];
char W_C[MAX_CWORD_LEN];
char G_C[MAX_CTYPE_LEN];
char E_C[MAX_CEXAM_LEN];
char W_E[MAX_EWORD_LEN];
char G_E[MAX_ETYPE_LEN];
char E_E[MAX_EEXAM_LEN];
char DEF[MAX_DEF_LEN];
char FIRST_SEM[MAX_DEF_LEN];
};
// 定义表dict的字段名:Dict_Fields[1..8]
CString Dict_Fields[10]={"","No","W_C","G_C","E_C",
"W_E","G_E","E_E","DEF","FIRST_SEM"};
/////////////////////////////////////////////////////////////////////////////
// CDlgCreate dialog
CDlgCreate::CDlgCreate(CWnd* pParent /*=NULL*/)
: CDialog(CDlgCreate::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgCreate)
m_EditSourceCString = _T("");
m_EditTargetCString = _T("");
//}}AFX_DATA_INIT
}
void CDlgCreate::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgCreate)
DDX_Text(pDX, IDC_EDIT_SOURCE, m_EditSourceCString);
DDX_Text(pDX, IDC_EDIT_TERGET, m_EditTargetCString);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgCreate, CDialog)
//{{AFX_MSG_MAP(CDlgCreate)
ON_BN_CLICKED(IDC_BUTTON_SOURCE, OnButtonSource)
ON_BN_CLICKED(IDC_BUTTON_TARGET, OnButtonTarget)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgCreate message handlers
void CDlgCreate::OnButtonSource()
{
// TODO: Add your control notification handler code here
// 给出提示信息
CString msg;
msg="您现在正在选定一个文件夹,\n";
msg+="请保证该文件夹下有下列文件:\n";
msg+="《知网》词典文件:hownet.txt\n";
msg+="实体义原层次结构文件:entity.txt\n";
msg+="事件义原层次结构文件:event.txt\n";
MessageBox(msg,"请注意",MB_ICONINFORMATION);
// 选定存放《知网》文本文件的文件夹
CString Path = "";
get_path(Path);
if (Path != "")
{
// m_EditSourceCString是文本框控件的连接变量,类型为CString
// 如果FileName取得了新的值,那么就更新文本框控件的显示
m_EditSourceCString = Path;
UpdateData(FALSE);
}
}
void CDlgCreate::OnButtonTarget()
{
// TODO: Add your control notification handler code here
// 设置文件选择对话框的属性标志,对应于“另存为”方式
DWORD dwFlags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
// 设置文件类型过滤字符串
CString FileFilter = "Mdb Files (*.mdb)|*.mdb|All Files (*.*)|*.*||";
// 以“另存为”方式选定一个文件
CString FileName = "";
FileName = get_file_name(FALSE, NULL, NULL, dwFlags, FileFilter);
if (FileName != "")
{
// m_EditTargetCString是文本框控件的连接变量,类型为CString
// 如果FileName取得了新的值,那么就更新文本框控件的显示
m_EditTargetCString = FileName;
UpdateData(FALSE);
}
}
void CDlgCreate::OnOK()
{
// TODO: Add extra validation here
if (m_EditSourceCString=="")
{
MessageBox("请您选定一个文件夹","请注意",MB_ICONERROR);
return;
}
if (m_EditTargetCString=="")
{
MessageBox("请您为数据库选定一个名字","请注意",MB_ICONERROR);
return;
}
CWaitCursor w;
// 建立《知网》数据库
// 数据库的名字是m_EditTargetCString
build_database(m_EditTargetCString);
// 建立表dict
// 得到《知网》词典hownet.txt的全路径名
CString dict_file_txt;
merge_path_name(m_EditSourceCString,"hownet.txt",dict_file_txt);
// 建立表dict,存放《知网》的双语知识词典
build_dict(dict_file_txt,m_EditTargetCString);
// 建立表entity
// 得到《知网》entity论元层次体系entity.txt的全路径名
CString entity_file_txt;
merge_path_name(m_EditSourceCString,"entity.txt",entity_file_txt);
// 建立表entity,存放《知网》的entity论元层次体系
int i_max_entity_name_len;
int i_entity=build_entity(entity_file_txt,m_EditTargetCString,i_max_entity_name_len);
// 建立表event
// 得到《知网》event论元层次体系event.txt的全路径名
CString event_file_txt;
merge_path_name(m_EditSourceCString,"event.txt",event_file_txt);
// 建立表event,存放《知网》的event论元层次体系
int i_max_event_name_len;
int i_event=build_event(event_file_txt,m_EditTargetCString,i_max_event_name_len);
// 建立空的表temp,该表只有两个字段,跟entity表和event表的前两个字段的结构一样
//
int i_name_len=i_max_entity_name_len;
if (i_name_len<i_max_event_name_len)
i_name_len=i_max_event_name_len;
int i_temp=build_temp(i_name_len,m_EditTargetCString);
MessageBox("数据库建立完毕");
CDialog::OnOK();
}
void CDlgCreate::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
BOOL CDlgCreate::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_EditSourceCString = "";
m_EditTargetCString = "";
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////
// 用VC++提供的对话框资源选定一个要打开或者创建的文件
//
// 函数声明:
// CString get_file_name( BOOL bOpenFileDialog = TRUE,
// LPCTSTR lpszDefExt = NULL,
// LPCTSTR lpszFileName = NULL,
// DWORD dwFlags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,
// CString FileFilter = "Txt Files (*.txt)|*.txt|All Files (*.*)|*.*||");
//
// 参数要求:
// 第一个参数BOOL bOpenFileDialog:布尔变量,显示对话框标题
// bOpenFileDialog==TRUE时,对话框标题为“打开”
// bOpenFileDialog==FALSE时,对话框标题为“另存为”
// 默认值为TRUE
// 第二个参数CString Ext:缺省的后缀,默认为NULL
// 第三个参数CString Name:缺省的文件名,默认为NULL
// 第四个参数DWORD dwFlags:对话框的一些特征
// dwFlags==OFN_ALLOWMULTISELECT,允许选择多个文件
// dwFlags==OFN_CREATEPROMPT,对话框标题为“打开”时,
// 若文件不存在,则给出提示
// dwFlags==OFN_OVERWRITEPROMPT,对话框标题为“另存为”时,
// 若文件不存在,则给出提示
// dwFlags==OFN_FILEMUSTEXIST,要求文件必须存在,使用该值时,
// 系统自动使用OFN_PATHMUSTEXIST
// 来与之配合,路径与文件有一个不
// 存在,则给出相应的提示信息
// dwFlags==OFN_HIDEREADONLY,隐藏“以只读方式打开”复选框
// dwFlags==OFN_READONLY,选中“以只读方式打开”复选框
// dwFlags==OFN_PATHMUSTEXIST,要求选定的路径必须存在,
// 若路径不存在,则给出提示
// 默认值为:OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,对应“打开”
// 另一常用值:OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,对应“另存为”
// 第五个参数:CString FileFilter,文件类型过滤字符串
// 默认值为:"Txt Files (*.txt)|*.txt|All Files (*.*)|*.*||"
//
// 返回值:CString类型,返回的是在本函数中选定的文件的全路径名
//
////////////////////////////////////////////////////////
CString CDlgCreate::get_file_name(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, CString FileFilter)
{
CString FileName="";
CFileDialog dlg(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, FileFilter);
if (dlg.DoModal()==IDOK)
{
POSITION pos=dlg.GetStartPosition();
while(pos!=NULL)
{
FileName=dlg.GetNextPathName(pos);
}
}
return FileName;
}
////////////////////////////////////////////////
// 取得《知网》词典词条的各个项的最大字符数
////////////////////////////////////////////////
void CDlgCreate::get_field_len(CString text_hownet_filename,unsigned int max_line_len[])
{
FILE *inFile;
CString TempStr;
//打开将要读取的《知网》文件
if (NULL==(inFile=fopen((const char*)text_hownet_filename,"rt")))
{
TempStr.Format("%s%s","无法打开文件:",text_hownet_filename);
AfxMessageBox(TempStr);
return;
}
char s[MAX_LEN],*p;
unsigned long line_count=0;
for (int i=0;i<10;i++)
{
max_line_len[i]=0;
}
while(!feof(inFile))
{
//先取一行
if (fgets(s,MAX_LEN,inFile)==NULL)
continue;
line_count++;
if ('\n'==s[strlen(s)-1])
s[strlen(s)-1]=0;
p=s;
while (*p && *p!='=')
p++;
p++;
int order=(line_count)%9;
if (strlen(p)>max_line_len[order])
{
max_line_len[order]=strlen(p);
}
if (order==8)
{
CString first=get_first_sem(p);
unsigned int f_len=first.GetLength();
if (f_len>max_line_len[9])
{
max_line_len[9]=f_len;
}
}
}
fclose(inFile);
}
////////////////////////////////////////////////
// 根据数组建立《知网》数据库的表dict的结构
// 数组的各个元素的值对应数据库各个字段的长度
// 数组 unsigned int max_line_len[1..8]有效
////////////////////////////////////////////////
void CDlgCreate::build_hownet_dictstru(CString filename_to_build,unsigned int field_len[])
{
CDaoDatabase myDatabase;
myDatabase.Open(filename_to_build);
// 建立表dict,存放的内容是《知网》词典
CDaoTableDef *pTable;
pTable=new CDaoTableDef(&myDatabase);
pTable->Create("dict");
pTable->CreateField(Dict_Fields[1],dbLong,4);
for (int i=2;i<10;i++)
{
pTable->CreateField(Dict_Fields[i],dbText,field_len[i]+5);
}
pTable->Append(); // 将表dict结构存入词库
pTable->Close();
delete pTable;
myDatabase.Close();
}
void CDlgCreate::build_hownet_dict(CString text_hownet_filename,CString mdb_filename)
{
//打开将要读取的《知网》文本文件
FILE *inFile;
if (NULL==(inFile=fopen((const char*)text_hownet_filename,"rt")))
{
CString TempStr;
TempStr.Format("%s%s","无法打开文件:",text_hownet_filename);
AfxMessageBox(TempStr);
return;
}
// 打开数据库mdb_filename
CDaoDatabase myDatabase;
myDatabase.Open(mdb_filename);
// 打开存放《知网》词典的表dict
CDaoTableDef *pTable;
pTable=new CDaoTableDef(&myDatabase);
pTable->Open("dict");
// 对应表dict打开记录集
CDaoRecordset *pRec;
pRec=new CDaoRecordset(&myDatabase);
pRec->Open(pTable);
char s[MAX_LEN],*p;
unsigned long rec_count=0,rec_inx_count=0;
unsigned long line_count=0;
struct DICTIONARY DICT_REC;
COleVariant cole_no;
COleVariant cole_wc(DICT_REC.W_C,VT_BSTRT);
COleVariant cole_gc(DICT_REC.G_C,VT_BSTRT);
COleVariant cole_ec(DICT_REC.E_C,VT_BSTRT);
COleVariant cole_we(DICT_REC.W_E,VT_BSTRT);
COleVariant cole_ge(DICT_REC.G_E,VT_BSTRT);
COleVariant cole_ee(DICT_REC.E_E,VT_BSTRT);
COleVariant cole_def(DICT_REC.DEF,VT_BSTRT);
COleVariant cole_first(DICT_REC.FIRST_SEM,VT_BSTRT);
// DICT_REC 的值全部赋为空
reset_dict_rec(DICT_REC);
while(!feof(inFile))
{
//先取一行
if (fgets(s,MAX_LEN,inFile)==NULL)
continue;
// 忽略等号和等号前面的东西
line_count++;
if ('\n'==s[strlen(s)-1])
s[strlen(s)-1]=0;
p=s;
while (*p && *p!='=')
p++;
p++;
// 根据 line_count 的值,决定赋值给哪个字段
switch (line_count%9)
{
case 0:
if (! dict_rec_getvalue(DICT_REC))
continue;
else // 把记录 DICT_REC 添加到表 dict 当中去
{
pRec->AddNew();
if (strcmp(DICT_REC.NUMBER,"")!=0)
{
cole_no=(long)atol(DICT_REC.NUMBER);
pRec->SetFieldValue("No",cole_no);
}
if (strcmp(DICT_REC.W_C,"")!=0)
{
cole_wc.SetString(DICT_REC.W_C,VT_BSTRT);
pRec->SetFieldValue("W_C",cole_wc);
}
if (strcmp(DICT_REC.G_C,"")!=0)
{
cole_gc.SetString(DICT_REC.G_C,VT_BSTRT);
pRec->SetFieldValue("G_C",cole_gc);
}
if (strcmp(DICT_REC.E_C,"")!=0)
{
cole_ec.SetString(DICT_REC.E_C,VT_BSTRT);
pRec->SetFieldValue("E_C",cole_ec);
}
if (strcmp(DICT_REC.W_E,"")!=0)
{
cole_we.SetString(DICT_REC.W_E,VT_BSTRT);
pRec->SetFieldValue("W_E",cole_we);
}
if (strcmp(DICT_REC.G_E,"")!=0)
{
cole_ge.SetString(DICT_REC.G_E,VT_BSTRT);
pRec->SetFieldValue("G_E",cole_ge);
}
if (strcmp(DICT_REC.E_E,"")!=0)
{
cole_ee.SetString(DICT_REC.E_E,VT_BSTRT);
pRec->SetFieldValue("E_E",cole_ee);
}
if (strcmp(DICT_REC.DEF,"")!=0)
{
cole_def.SetString(DICT_REC.DEF,VT_BSTRT);
pRec->SetFieldValue("DEF",cole_def);
CString first_sem=get_first_sem(DICT_REC.DEF);
strcpy(DICT_REC.FIRST_SEM,first_sem);
if (strcmp(DICT_REC.FIRST_SEM,"")!=0)
{
cole_first.SetString(DICT_REC.FIRST_SEM,VT_BSTRT);
pRec->SetFieldValue("FIRST_SEM",cole_first);
}
}
pRec->Update();
}
// DICT_REC 的值全部赋为空
reset_dict_rec(DICT_REC);
continue;
case 1:
strcpy(DICT_REC.NUMBER,p);
break;
case 2:
strcpy(DICT_REC.W_C,p);
break;
case 3:
strcpy(DICT_REC.G_C,p);
break;
case 4:
strcpy(DICT_REC.E_C,p);
break;
case 5:
strcpy(DICT_REC.W_E,p);
break;
case 6:
strcpy(DICT_REC.G_E,p);
break;
case 7:
strcpy(DICT_REC.E_E,p);
break;
case 8:
strcpy(DICT_REC.DEF,p);
break;
}
}
if (line_count%9==8 && dict_rec_getvalue(DICT_REC))
{
// 把记录 DICT_REC 添加到表 dict 当中去
// 跟前面一段代码相同
pRec->AddNew();
cole_no.SetString(DICT_REC.NUMBER,VT_BSTRT);
pRec->SetFieldValue("No",cole_no);
pRec->Update();
}
fclose(inFile);
pRec->Close();
delete pRec;
pTable->Close();
delete pTable;
myDatabase.Close();
}
///////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -