?? 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 + -