?? dlgcreate.cpp
字號:
// struct DICTIONARY DICT_REC 的值全部賦為空
///////////////////////////////////////////////
void CDlgCreate::reset_dict_rec(struct DICTIONARY &DICT_REC)
{
strcpy(DICT_REC.NUMBER,"");
strcpy(DICT_REC.W_C,"");
strcpy(DICT_REC.G_C,"");
strcpy(DICT_REC.E_C,"");
strcpy(DICT_REC.W_E,"");
strcpy(DICT_REC.G_E,"");
strcpy(DICT_REC.E_E,"");
strcpy(DICT_REC.DEF,"");
strcpy(DICT_REC.FIRST_SEM,"");
}
//////////////////////////////////////////////////
// 判定struct DICTIONARY DICT_REC 是否全部賦值
//////////////////////////////////////////////////
int CDlgCreate::dict_rec_getvalue(struct DICTIONARY DICT_REC)
{
if (strcmp(DICT_REC.NUMBER,"")==0) // 序號不能為空
return 0;
else if (strcmp(DICT_REC.W_C,"")==0) // W_C不能為空
return 0;
else if (strcmp(DICT_REC.G_C,"")==0) // G_C不能為空
return 0;
else if (strcmp(DICT_REC.W_E,"")==0) // W_E不能為空
return 0;
else if (strcmp(DICT_REC.G_E,"")==0) // G_E不能為空
return 0;
else if (strcmp(DICT_REC.DEF,"")==0) // DEF不能為空
return 0;
return 1;
}
/////////////////////////////////////////////
//判斷文件存在與否
/////////////////////////////////////////////
int CDlgCreate::exist_file(CString file_name)
{
char name[MAX_LEN];
strcpy(name,file_name);
return (access(name, 0) == 0);
}
//////////////////////////////////////////////////////
// 建立表dict,存放《知網》的雙語知識詞典
//////////////////////////////////////////////////////
void CDlgCreate::build_dict(CString hownet_txt_file, CString hownet_database_file)
{
// 定義存放《知網》詞典各個項的最大字符數目的數組
unsigned int max_line_len[10];
// 取得《知網》詞典詞條的各個項的最大字符數
get_field_len(hownet_txt_file,max_line_len);
// 根據《知網》詞典各個項的最大字符數
// 建立《知網》數據庫的表dict的庫結構
// 上述各個項的最大字符數對應數據庫各個字段的長度
build_hownet_dictstru(hownet_database_file,max_line_len);
build_hownet_dict(hownet_txt_file,hownet_database_file);
}
//////////////////////////////////////////////////////
// 建立表dict,存放《知網》的雙語知識詞典
//////////////////////////////////////////////////////
void CDlgCreate::build_database(CString hownet_database_file)
{
// 建立《知網》數據庫的庫結構
// 只是建立一個空庫
if (exist_file(hownet_database_file))
{
CString msg;
msg.Format("文件 %s 已經存在,要覆蓋它嗎?",hownet_database_file);
int answer=MessageBox(msg,"覆蓋已經存在的文件嗎?",MB_ICONQUESTION|MB_YESNO);
if (answer==IDYES)
{
if (remove(hownet_database_file) != 0)
{
MessageBox("不能刪除該文件","提示",MB_ICONINFORMATION);
return;
}
}
else
return;
}
CDaoDatabase myDatabase;
myDatabase.Create(hownet_database_file);
myDatabase.Close();
}
/////////////////////////////////////////////
// 選定一個文件夾,返回其名稱
//////////////////////////////////////////////
void CDlgCreate::get_path(CString &my_path)
{
BROWSEINFO bi; //文件夾瀏覽結構
char dispname[MAX_PATH],path[MAX_PATH];
ITEMIDLIST *pidl;
//初始化bi
bi.hwndOwner=0;
bi.pidlRoot=0;
bi.pszDisplayName=dispname;
bi.lpszTitle="請選擇文件操作所在的目錄:";
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lpfn=0;
bi.lParam=0;
bi.iImage=0;
//彈出文件夾窗口,并選取目錄
if (pidl=SHBrowseForFolder(&bi))
{
SHGetPathFromIDList(pidl,path); //取得目錄信息
my_path=path;
UpdateData(FALSE);
}
if (my_path=="")
return;
else if (my_path.GetAt(my_path.GetLength()-1)=='\\' &&
my_path.GetAt(my_path.GetLength()-2)!=':')
my_path=my_path.Left(my_path.GetLength()-1);
return;
}
////////////////////////////////////////////////////
// 把路徑名和文件名合成全路徑文件名
////////////////////////////////////////////////////
void CDlgCreate::merge_path_name(CString Path, CString Name, CString &FullName)
{
FullName=Path;
if (Path.GetAt(Path.GetLength()-1)!='\\')
FullName+="\\";
FullName+=Name;
}
//////////////////////////////////////////////////////
// 建立表entity,存放《知網》的entity層次體系
//////////////////////////////////////////////////////
int CDlgCreate::build_entity(CString entity_txt_file, CString hownet_database_file, int &i_max_entity_name_len)
{
int i_e_read_pointer;
struct fieleds_len entity_fields_len;
// 建立名詞entity層次樹
i_e_read_pointer=-1;
i_e_read_pointer=e_build_layer_tree(entity_txt_file,E_NODE,MAX_EVENT_NUMBER,entity_fields_len);
if (i_e_read_pointer==-1)
return -1;
//輸出建立的名詞entity層次樹到數據庫中
int i_to_database=e_put_layer_tree_to_database(hownet_database_file,E_NODE,i_e_read_pointer,entity_fields_len);
if (i_e_read_pointer==-1)
return -1;
i_max_entity_name_len=entity_fields_len.len_name;
return 0;
}
////////////////////////////////////////////////
//
// 建立名詞entity義原層次結構樹
//
////////////////////////////////////////////////
int CDlgCreate::e_build_layer_tree(CString FileName,entity_tree *NODE,int max_read_number,struct fieleds_len &entity_fields_len)
{
//定義后進先出棧
int STACK[MAX_ENTITY_LAYER]; //里面存放的是節點在NODE[]中的位置
//定義節點的指針(只是一些數,指示節點的位置)
int i_read_pointer;
//定義棧的指針
int i_stack_pointer;
// 初始化entity_fields_len
entity_fields_len.len_name=0;
entity_fields_len.len_attr=0;
entity_fields_len.len_order=4;
entity_fields_len.len_layer=4;
entity_fields_len.len_parent=4;
entity_fields_len.len_son=4;
entity_fields_len.len_brother=4;
//打開選定的文件
CStdioFile inFile;
if (!inFile.Open(FileName,CFile::modeRead))
{
CString TempStr;
TempStr.Format("%s%s","無法讀取文件:",FileName);
AfxMessageBox(TempStr);
return -1;
}
//一行行地讀取文件直到文件結束
i_read_pointer=0;
i_stack_pointer=-1;
char s[MAX_LINE_LEN]; //定義s存放讀入的字符串,這里MAX_LINE_LEN是一個預先定
//義的常量,一行的最大允許字符的個數
while(inFile.ReadString(s,MAX_LINE_LEN))
{
char *p=s+strlen(s)-1;
while (p>s && isspace(*p))
p--;
if (p<=s)
s[0]='\0';
if (strlen(s)==0)
continue;
//節點賦初值
CString entity_name="",entity_role="";
get_name_attr(s,entity_name,entity_role);
del_englidh_info(entity_name);
del_englidh_info(entity_role);
if (entity_name.GetLength()>entity_fields_len.len_name)
entity_fields_len.len_name=entity_name.GetLength();
if (entity_role.GetLength()>entity_fields_len.len_attr)
entity_fields_len.len_attr=entity_role.GetLength();
NODE[i_read_pointer].entity_name=entity_name;
NODE[i_read_pointer].entity_attr=entity_role;
if (NODE[i_read_pointer].entity_name=="")
NODE[i_read_pointer].entity_name="*";
if (NODE[i_read_pointer].entity_attr=="")
NODE[i_read_pointer].entity_attr="*";
NODE[i_read_pointer].order=i_read_pointer;
NODE[i_read_pointer].son=-1;
NODE[i_read_pointer].brother=-1;
NODE[i_read_pointer].parent=-1;
//確定節點的層次
NODE[i_read_pointer].layer=get_layer(s);
if (NODE[i_read_pointer].layer<0)
{
CString msg;
msg.Format("建立層次樹的時候出了問題,請檢查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
MessageBox(msg);
return -1;
}
//建立動詞義原層次樹
if (i_stack_pointer==-1) //如果棧為空,剛讀到的節點是根節點
{
NODE[i_read_pointer].layer=0;
i_stack_pointer=0;
STACK[i_stack_pointer]=NODE[i_read_pointer].order;
}
else //剛讀到的節點不是根節點,要入棧
{
//如果是棧頂節點的層次大于當前節點的層次
//那么應該退棧,直到前者小與或者等于后者
while (NODE[STACK[i_stack_pointer]].layer>NODE[i_read_pointer].layer)
{
i_stack_pointer--;
if (i_stack_pointer<0)
{
CString msg;
msg.Format("建立層次樹的時候出了問題,請檢查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
MessageBox(msg);
return -1;
}
}
if (NODE[STACK[i_stack_pointer]].layer==NODE[i_read_pointer].layer)
//棧頂節點與當前節點是兄弟關系
{
NODE[STACK[i_stack_pointer]].brother=NODE[i_read_pointer].order;
NODE[i_read_pointer].parent=NODE[STACK[i_stack_pointer]].parent;
STACK[i_stack_pointer]=NODE[i_read_pointer].order;
}
else if (NODE[STACK[i_stack_pointer]].layer==NODE[i_read_pointer].layer-1)
//棧頂節點與當前節點是父子關系
{
NODE[i_read_pointer].parent=STACK[i_stack_pointer];
NODE[STACK[i_stack_pointer]].son=NODE[i_read_pointer].order;
i_stack_pointer++;
STACK[i_stack_pointer]=NODE[i_read_pointer].order;
}
else
{
CString msg;
msg.Format("建立層次樹的時候出了問題,請檢查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
MessageBox(msg);
return -1;
}
}
i_read_pointer++;
if (i_read_pointer>=max_read_number)
{
CString msg;
msg.Format("建立層次樹的時候出了問題,源文件\n%s 行數太多,預留數組空間不足",FileName);
MessageBox(msg);
return -1;
}
}
inFile.Close();
return i_read_pointer;
}
///////////////////////////////////////////////
//
// 把名詞entity實體層次樹填入數據庫的entity表
//
///////////////////////////////////////////////
int CDlgCreate::e_put_layer_tree_to_database(CString FileName_out, struct entity_tree *NODE,int i_write_pointer,struct fieleds_len entity_fields_len)
{
// 建立表entity
build_hownet_entitystru(FileName_out,entity_fields_len);
// 打開數據庫FileName_out
CDaoDatabase myDatabase;
myDatabase.Open(FileName_out);
// 打開存放entity層次關系的表entity
CDaoTableDef *pTable;
pTable=new CDaoTableDef(&myDatabase);
pTable->Open("entity");
// 對應表dict打開記錄集
CDaoRecordset *pRec;
pRec=new CDaoRecordset(&myDatabase);
pRec->Open(pTable);
//輸出建立的entity層次樹導數據庫的表entity
struct record
{
CString COrder;
CString CName;
CString CAttr;
CString CLayer;
CString CParent;
CString CSon;
CString CBrother;
}REC;
COleVariant cole_order;
COleVariant cole_name(REC.CName,VT_BSTRT);
COleVariant cole_attr(REC.CAttr,VT_BSTRT);
COleVariant cole_layer;
COleVariant cole_parent;
COleVariant cole_son;
COleVariant cole_brother;
for (int i=0;i<i_write_pointer;i++)
{
pRec->AddNew();
cole_order=(long)NODE[i].order;
pRec->SetFieldValue("序號",cole_order);
REC.CName.Format("%s",NODE[i].entity_name);
cole_name.SetString(REC.CName,VT_BSTRT);
pRec->SetFieldValue("名稱",cole_name);
REC.CAttr.Format("%s",NODE[i].entity_attr);
cole_attr.SetString(REC.CAttr,VT_BSTRT);
pRec->SetFieldValue("屬性",cole_attr);
cole_layer=(long)NODE[i].layer;
pRec->SetFieldValue("層次",cole_layer);
cole_parent=(long)NODE[i].parent;
pRec->SetFieldValue("父親",cole_parent);
cole_son=(long)NODE[i].son;
pRec->SetFieldValue("兒子",cole_son);
cole_brother=(long)NODE[i].brother;
pRec->SetFieldValue("兄弟",cole_brother);
pRec->Update();
}
pRec->Close();
delete pRec;
pTable->Close();
delete pTable;
myDatabase.Close();
/*
//輸出建立的層次樹之二-----調試程序
CString FileName_out2=FileName_out+".txt";
CStdioFile outFile;
if (!outFile.Open(FileName_out2,CFile::modeCreate|CFile::modeWrite))
{
CString TempStr;
TempStr.Format("%s%s","無法創建文件:",FileName_out2);
AfxMessageBox(TempStr);
return -1;
}
for (int k=0;k<i_write_pointer;k++)
{
CString s_wr="";
for(int j=0;j<NODE[k].layer*3+2;j++)
s_wr+=" ";
s_wr+=NODE[k].entity_name;
s_wr+=" ";
s_wr+=NODE[k].entity_attr;
s_wr+="\n";
outFile.WriteString(s_wr);
}
outFile.Close();
*/
return 0;
}
////////////////////////////////////////////
//
// 獲得名詞義原entity的名字和性質
//
////////////////////////////////////////////
void CDlgCreate::get_name_attr(char *str,CString &entity_name,CString &entity_role)
{
entity_name=entity_role="";
char *p,*q;
char fetch_str[MAX_LINE_LEN];
p=str;
//定位到第一個英文字母
while (*p && !(isascii(*p) && isalpha(*p)))
{
if (!isascii(*p))
p++;
p++;
}
if (*p=='\0')
return;
//開始拷貝動詞義原的名字
q=fetch_str;
while (*p && !(isascii(*p) && isspace(*p)))
{
if (!isascii(*p))
*q++=*p++;
*q++=*p++;
}
*q='\0';
entity_name=fetch_str;
//定位到第一個"["
while (*p && *p!='[')
{
if (!isascii(*p))
p++;
p++;
}
if (*p=='\0')
return;
p++;
//開始拷貝名詞屬性
q=fetch_str;
while (*p && *p!=']')
{
if (!isascii(*p))
*q++=*p++;
*q++=*p++;
}
*q='\0';
entity_role=fetch_str;
}
//////////////////////////////////////////////////////
//刪除DEF中的英文信息
//////////////////////////////////////////////////////
void CDlgCreate::del_englidh_info(CString & def_info)
{
char new_info[MAX_LEN],*p=new_info;
for(int i=0;i<def_info.GetLength();i++)
{
char ch=def_info.GetAt(i);
if (isascii(ch))
{
if (isalpha(ch) && !eq_after_it(def_info,i) || '|'==ch)
continue;
else
*p++=ch;
}
else
{
*p++=ch;
if (i<def_info.GetLength()-1)
*p++=def_info.GetAt(++i);
}
}
*p='\0';
def_info=new_info;
}
////////////////////////////////////////////
//
// 獲得節點的層次
//
////////////////////////////////////////////
int CDlgCreate::get_layer(char *str)
{
char *p=str;
//定位到第一個英文字母
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -