C语言 英汉互译电子词典 命令行,MFC,QT 3种版本
生活随笔
收集整理的這篇文章主要介紹了
C语言 英汉互译电子词典 命令行,MFC,QT 3种版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需要1個字典文件。
命令行版
MFC版
QT版
1,命令行版 -- 【1】
#define?_CRT_SECURE_NO_WARNINGS #include?<stdio.h> #include?<stdlib.h> #include?<string.h> #include?<time.h>#define?MAX?111111?//最大記錄數struct?dict {char?*key;char?*content; };//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename) {FILE?*pfile?=?fopen(dict_filename,?"r");if?(p?==?NULL)return?0;//打開文件失敗,函數返回*p?=?(struct?dict?*)malloc(sizeof(struct?dict)?*?MAX);//固定分配MAX大小內存memset(*p,?0,?sizeof(struct?dict)?*?MAX);//將分配內存初始化為0struct?dict?*pD?=?*p;//pD指向數組p的首地址char?buf[1024]?=?{?0?};size_t?len?=?0;int?i?=?0;//計數器while?(!feof(pfile))//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);//讀取文件一行len?=?strlen(buf);//得到讀取到字符串長度if?(len?>?0){pD[i].key?=?(char?*)malloc(len);//根據字符串長度分配內存memset(pD[i].key,?0,?len);strcpy(pD[i].key,?&buf[1]);//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);len?=?strlen(buf);if?(len?>?0){pD[i].content?=?(char?*)malloc(len);memset(pD[i].content,?0,?len);strcpy(pD[i].content,?&buf[6]);}i++;//計數器加1}fclose(pfile);//關閉字典文件return?i;//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//遍歷字典{if?((p[i].key?==?NULL)?||?(p[i].content?==?NULL))continue;if?(strncmp(p[i].key,?key,?strlen(key))?==?0){strcpy(content,?p[i].content);return?1;//找到符合條件記錄,返回1}}return?0;//沒有找到符合條件記錄,返回0 }//釋放內存 void?free_dict(struct?dict?*p,?int?size) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//循環釋放key與content成員內存{if?(p[i].key)free(p[i].key);if?(p[i].content)free(p[i].content);}free(p);//釋放p內存 }int?main(int?argc,?char?*args[]) {if?(argc?<?2){printf("usage:?%s?dict-filename\n",?args[0]);return?0;//參數不足,程序退出}long?start_ms?=?0;//記錄函數執行的開始時間long?end_ms?=?0;//記錄函數執行的結束時間struct?dict?*p?=?NULL;start_ms?=?clock();int?size?=?open_dict(&p,?args[1]);//根據命令行第一個參數做為字典文件名,打開字典文件if?(size?==?0)return?0;//打開字典文件失敗,程序退出end_ms?=?clock();printf("open_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒char?key[1024];char?content[1024];while?(1){memset(key,?0,?sizeof(key));memset(content,?0,?sizeof(content));scanf("%s",?key);//從鍵盤得到用戶輸入if?(strncmp(key,?"command=exit",?12)?==?0)break;start_ms?=?clock();if?(search_dict(p,?size,?key,?content))//根據用戶輸入,在字典中檢索{printf("%s",?content);}?else{printf("not?found\n");}end_ms?=?clock();printf("search_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒};start_ms?=?clock();free_dict(p,?size);end_ms?=?clock();printf("free_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒return?0; }1,命令行版 -- 【2】,這個可以自動讀取字典文件到底有多少行
#define?_CRT_SECURE_NO_WARNINGS #include?<stdio.h> #include?<stdlib.h> #include?<string.h> #include?<time.h>struct?dict {char?*key;char?*content; };int?get_dict_size(FILE?*pfile)//得到字典文件中詞條總數 {if?(pfile?==?NULL)return?0;int?i?=?0;char?buf[2048];while?(!feof(pfile)){fgets(buf,?sizeof(buf),?pfile);fgets(buf,?sizeof(buf),?pfile);i++;//讀取兩行后,計數器加1}return?i; }//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename) {FILE?*pfile?=?fopen(dict_filename,?"r");if?(p?==?NULL)return?0;//打開文件失敗,函數返回int?size?=?get_dict_size(pfile);//得到字典文件中詞條總數if?(size?==?0)return?0;*p?=?(struct?dict?*)malloc(sizeof(struct?dict)?*?size);//根據字典文件詞條總數分配內存memset(*p,?0,?sizeof(struct?dict)?*?size);//將分配內存初始化為0struct?dict?*pD?=?*p;//pD指向數組p的首地址char?buf[2048]?=?{?0?};size_t?len?=?0;int?i?=?0;fseek(pfile,?0L,?SEEK_SET);//設置讀取位置為字典文件開始while?(!feof(pfile))//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);//讀取文件一行len?=?strlen(buf);//得到讀取到字符串長度if?(len?>?0){pD[i].key?=?(char?*)malloc(len);//根據字符串長度分配內存memset(pD[i].key,?0,?len);strcpy(pD[i].key,?&buf[1]);//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);len?=?strlen(buf);if?(len?>?0){pD[i].content?=?(char?*)malloc(len);memset(pD[i].content,?0,?len);strcpy(pD[i].content,?&buf[6]);}i++;}fclose(pfile);//關閉字典文件return?i;//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//遍歷字典{if?((p[i].key?==?NULL)?||?(p[i].content?==?NULL))continue;if?(strncmp(p[i].key,?key,?strlen(key))?==?0){strcpy(content,?p[i].content);return?1;//找到符合條件記錄,返回1}}return?0;//沒有找到符合條件記錄,返回0 }//釋放內存 void?free_dict(struct?dict?*p,?int?size) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//循環釋放key與content成員內存{if?(p[i].key)free(p[i].key);if?(p[i].content)free(p[i].content);}free(p);//釋放p內存 }int?main(int?argc,?char?*args[]) {if?(argc?<?2){printf("usage:?%s?dict-filename\n",?args[0]);return?0;//參數不足,程序退出}long?start_ms?=?0;//記錄函數執行的開始時間long?end_ms?=?0;//記錄函數執行的結束時間struct?dict?*p?=?NULL;start_ms?=?clock();int?size?=?open_dict(&p,?args[1]);//根據命令行第一個參數做為字典文件名,打開字典文件if?(size?==?0)return?0;//打開字典文件失敗,程序退出end_ms?=?clock();printf("open_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒char?key[2048];char?content[2048];while?(1){memset(key,?0,?sizeof(key));memset(content,?0,?sizeof(content));scanf("%s",?key);//從鍵盤得到用戶輸入if?(strncmp(key,?"command=exit",?12)?==?0)break;start_ms?=?clock();if?(search_dict(p,?size,?key,?content))//根據用戶輸入,在字典中檢索{printf("%s",?content);}?else{printf("not?found\n");}end_ms?=?clock();printf("search_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒};start_ms?=?clock();free_dict(p,?size);//釋放內存end_ms?=?clock();printf("free_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒return?0; }1,命令行版 -- 【3】,利用鏈表,1次就可以自動讀取字典文件到底有多少行
#define?_CRT_SECURE_NO_WARNINGS #include?<stdio.h> #include?<stdlib.h> #include?<string.h> #include?<time.h>struct?dict {char?*key;char?*content;struct?dict?*next;//指向鏈表下一個節點的指針 };//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename)//open?dict.txt,and?read?dict {FILE?*pfile?=?fopen(dict_filename,?"r");//只讀方式打開文件if?(p?==?NULL)return?0;//打開文件失敗,函數返回char?buf[2048]?=?{?0?};size_t?len?=?0;int?i?=?0;//計數器,記錄讀到到的詞條總數*p?=?(struct?dict?*)malloc(sizeof(struct?dict));//分配鏈表首節點內存memset(*p,?0,?sizeof(struct?dict));struct?dict?*pD?=?*p;//pD指向鏈表首地址while?(!feof(pfile))//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);//讀取文件一行len?=?strlen(buf);//得到讀取到字符串長度if?(len?>?0){pD->key?=?(char?*)malloc(len);//根據字符串長度分配內存memset(pD->key,?0,?len);strcpy(pD->key,?&buf[1]);//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);len?=?strlen(buf);if?(len?>?0){pD->content?=?(char?*)malloc(len);memset(pD->content,?0,?len);strcpy(pD->content,?&buf[6]);}pD->next?=?(struct?dict?*)malloc(sizeof(struct?dict));//為鏈表的下一個節點分配內存memset(pD->next,?0,?sizeof(struct?dict));pD?=?pD->next;//將pD指向下一個節點位置i++;}fclose(pfile);//關閉字典文件return?i;//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {const?struct?dict?*pD?=?p;while?(pD)//遍歷字典{if?((pD->key)?&&?(pD->content)){if?(strncmp(pD->key,?key,?strlen(key))?==?0){strcpy(content,?pD->content);return?1;//找到符合條件記錄,返回1}}pD?=?pD->next;//指向鏈表下一個節點位置}return?0;//沒有找到符合條件記錄,返回0 }//釋放鏈表內存 void?free_dict(struct?dict?*p,?int?size) {struct?dict?*pD?=?p;while?(pD){if?(pD->key)//刪除鏈表節點中key成員內存free(pD->key);if?(pD->content)//刪除鏈表節點中content成員內存free(pD->content);struct?dict?*tmp?=?pD->next;//保存鏈表下一個節點的地址free(pD);//刪除鏈表當前節點pD?=?tmp;//p指向下一個節點的位置} }int?main(int?argc,?char?*args[]) {if?(argc?<?2){printf("usage:?%s?dict-filename\n",?args[0]);return?0;//參數不足,程序退出}long?start_ms?=?0;//記錄函數執行的開始時間long?end_ms?=?0;//記錄函數執行的結束時間start_ms?=?clock();struct?dict?*p?=?NULL;int?size?=?open_dict(&p,?args[1]);//根據命令行第一個參數做為字典文件名,打開字典文件if?(size?==?0)return?0;//打開字典文件失敗,程序退出end_ms?=?clock();printf("open_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒char?key[2048];char?content[2048];while?(1){memset(key,?0,?sizeof(key));memset(content,?0,?sizeof(content));scanf("%s",?key);//從鍵盤得到用戶輸入if?(strncmp(key,?"command=exit",?12)?==?0)break;start_ms?=?clock();if?(search_dict(p,?size,?key,?content))//根據用戶輸入,在字典中檢索{printf("%s",?content);}?else{printf("not?found\n");}end_ms?=?clock();printf("search_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒};start_ms?=?clock();free_dict(p,?size);//釋放鏈表內存end_ms?=?clock();printf("free_dict?used?%ld?ms\n",?end_ms?-?start_ms);//打印函數執行時間,單位:毫秒return?0; }1,命令行版 -- 【4】,linux終端字符是UTF8的,在【3】的基礎加入字符轉換
#include?<stdio.h> #include?<stdlib.h> #include?<string.h> #include?<time.h>#include?<unistd.h> #include?<errno.h> #include?<iconv.h>int?gbk2utf8(char?*src,?size_t?*srclen,?char?*dest,?size_t?*destlen) {iconv_t?cd?=?iconv_open("UTF8",?"GBK");?//源字符串為GBK,目標UTF8if?(cd?==?(iconv_t)?-?1){printf("open?iconv?error?%s\n",?strerror(errno));return?-1;}size_t?rc?=?iconv(cd,?&src,?srclen,?&dest,?destlen);?//將src字符串轉化為目標destif?(rc?==?(size_t)?-?1){printf("iconv?error?%s\n",?strerror(errno));return?-1;}iconv_close(cd);return?0; }struct?dict {char?*key;char?*content;struct?dict?*next;?//指向鏈表下一個節點的指針 };//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename)?//open?dict.txt,and?read?dict {FILE?*pfile?=?fopen(dict_filename,?"r");?//只讀方式打開文件if?(p?==?NULL)return?0;?//打開文件失敗,函數返回char?buf[2048]?=?{?0?};char?srcbuf[2048]?=?{?0?};size_t?len?=?0;size_t?srclen?=?0;int?i?=?0;?//計數器,記錄讀到到的詞條總數*p?=?(struct?dict?*)?malloc(sizeof(struct?dict));?//分配鏈表首節點內存memset(*p,?0,?sizeof(struct?dict));struct?dict?*pD?=?*p;?//pD指向鏈表首地址while?(!feof(pfile))?//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));memset(srcbuf,?0,?sizeof(srcbuf));fgets(srcbuf,?sizeof(srcbuf),?pfile);?//讀取文件一行srclen?=?strlen(srcbuf);len?=?sizeof(buf);gbk2utf8(srcbuf,?&srclen,?buf,?&len);//將讀取到的字符串從gbk轉化為utf8格式len?=?strlen(buf);?//得到讀取到字符串長度if?(len?>?0){pD->key?=?(char?*)?malloc(len);?//根據字符串長度分配內存memset(pD->key,?0,?len);strcpy(pD->key,?&buf[1]);?//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));memset(srcbuf,?0,?sizeof(srcbuf));fgets(srcbuf,?sizeof(srcbuf),?pfile);srclen?=?strlen(srcbuf);len?=?sizeof(buf);gbk2utf8(srcbuf,?&srclen,?buf,?&len);len?=?strlen(buf);if?(len?>?0){pD->content?=?(char?*)?malloc(len);memset(pD->content,?0,?len);strcpy(pD->content,?&buf[6]);}pD->next?=?(struct?dict?*)?malloc(sizeof(struct?dict));?//為鏈表的下一個節點分配內存memset(pD->next,?0,?sizeof(struct?dict));pD?=?pD->next;?//將pD指向下一個節點位置i++;}fclose(pfile);?//關閉字典文件return?i;?//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {const?struct?dict?*pD?=?p;while?(pD)?//遍歷字典{if?((pD->key)?&&?(pD->content)){if?(strncmp(pD->key,?key,?strlen(key))?==?0){strcpy(content,?pD->content);return?1;?//找到符合條件記錄,返回1}}pD?=?pD->next;?//指向鏈表下一個節點位置}return?0;?//沒有找到符合條件記錄,返回0 }//釋放鏈表內存 void?free_dict(struct?dict?*p,?int?size) {struct?dict?*pD?=?p;while?(pD){if?(pD->key)?//刪除鏈表節點中key成員內存free(pD->key);if?(pD->content)?//刪除鏈表節點中content成員內存free(pD->content);struct?dict?*tmp?=?pD->next;?//保存鏈表下一個節點的地址free(pD);?//刪除鏈表當前節點pD?=?tmp;?//p指向下一個節點的位置} }int?main(int?argc,?char?*args[]) {if?(argc?<?2){printf("usage:?%s?dict-filename\n",?args[0]);return?0;?//參數不足,程序退出}long?start_ms?=?0;?//記錄函數執行的開始時間long?end_ms?=?0;?//記錄函數執行的結束時間start_ms?=?clock();struct?dict?*p?=?NULL;int?size?=?open_dict(&p,?args[1]);?//根據命令行第一個參數做為字典文件名,打開字典文件if?(size?==?0)return?0;?//打開字典文件失敗,程序退出end_ms?=?clock();printf("open_dict?used?%ld?ms\n",?end_ms?-?start_ms);?//打印函數執行時間,單位:毫秒char?key[2048];char?content[2048];while?(1){memset(key,?0,?sizeof(key));memset(content,?0,?sizeof(content));scanf("%s",?key);?//從鍵盤得到用戶輸入if?(strncmp(key,?"command=exit",?12)?==?0)break;start_ms?=?clock();if?(search_dict(p,?size,?key,?content))?//根據用戶輸入,在字典中檢索{printf("%s",?content);}?else{printf("not?found\n");}end_ms?=?clock();printf("search_dict?used?%ld?ms\n",?end_ms?-?start_ms);?//打印函數執行時間,單位:毫秒};start_ms?=?clock();free_dict(p,?size);?//釋放鏈表內存end_ms?=?clock();printf("free_dict?used?%ld?ms\n",?end_ms?-?start_ms);?//打印函數執行時間,單位:毫秒return?0; }MFC部分代碼:
完整代碼在云盤,51cto目錄
//?MFCApplication5Dlg.cpp?:?實現文件 //#include?"stdafx.h" #include?"MFCApplication5.h" #include?"MFCApplication5Dlg.h" #include?"afxdialogex.h"#pragma?warning(disable:4996) #ifdef?_DEBUG #define?new?DEBUG_NEW #endifstruct?dict {char?*key;char?*content; };int?get_dict_size(FILE?*pfile)//得到字典文件中詞條總數 {if?(pfile?==?NULL)return?0;int?i?=?0;char?buf[2048];while?(!feof(pfile)){fgets(buf,?sizeof(buf),?pfile);fgets(buf,?sizeof(buf),?pfile);i++;//讀取兩行后,計數器加1}return?i; }//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename) {FILE?*pfile?=?fopen(dict_filename,?"r");if?(p?==?NULL)return?0;//打開文件失敗,函數返回int?size?=?get_dict_size(pfile);//得到字典文件中詞條總數if?(size?==?0)return?0;*p?=?(struct?dict?*)malloc(sizeof(struct?dict)?*?size);//根據字典文件詞條總數分配內存memset(*p,?0,?sizeof(struct?dict)?*?size);//將分配內存初始化為0struct?dict?*pD?=?*p;//pD指向數組p的首地址char?buf[2048]?=?{?0?};size_t?len?=?0;int?i?=?0;fseek(pfile,?0L,?SEEK_SET);//設置讀取位置為字典文件開始while?(!feof(pfile))//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);//讀取文件一行len?=?strlen(buf);//得到讀取到字符串長度if?(len?>?0){pD[i].key?=?(char?*)malloc(len);//根據字符串長度分配內存memset(pD[i].key,?0,?len);strcpy(pD[i].key,?&buf[1]);//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);len?=?strlen(buf);if?(len?>?0){pD[i].content?=?(char?*)malloc(len);memset(pD[i].content,?0,?len);strcpy(pD[i].content,?&buf[6]);}i++;}fclose(pfile);//關閉字典文件return?i;//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//遍歷字典{if?((p[i].key?==?NULL)?||?(p[i].content?==?NULL))continue;if?(strncmp(p[i].key,?key,?strlen(key))?==?0){strcpy(content,?p[i].content);return?1;//找到符合條件記錄,返回1}}return?0;//沒有找到符合條件記錄,返回0 }//釋放內存 void?free_dict(struct?dict?*p,?int?size) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//循環釋放key與content成員內存{if?(p[i].key)free(p[i].key);if?(p[i].content)free(p[i].content);}free(p);//釋放p內存 }struct?dict?*p?=?NULL; int?dict_size?=?0;//?用于應用程序“關于”菜單項的?CAboutDlg?對話框class?CAboutDlg?:?public?CDialogEx { public:CAboutDlg();//?對話框數據enum?{?IDD?=?IDD_ABOUTBOX?};protected:virtual?void?DoDataExchange(CDataExchange*?pDX);????//?DDX/DDV?支持//?實現 protected:DECLARE_MESSAGE_MAP() };CAboutDlg::CAboutDlg()?:?CDialogEx(CAboutDlg::IDD) { }void?CAboutDlg::DoDataExchange(CDataExchange*?pDX) {CDialogEx::DoDataExchange(pDX); }BEGIN_MESSAGE_MAP(CAboutDlg,?CDialogEx) END_MESSAGE_MAP()//?CMFCApplication5Dlg?對話框CMFCApplication5Dlg::CMFCApplication5Dlg(CWnd*?pParent?/*=NULL*/):?CDialogEx(CMFCApplication5Dlg::IDD,?pParent),?text1(_T("")),?lable1(_T("")) {m_hIcon?=?AfxGetApp()->LoadIcon(IDR_MAINFRAME); }void?CMFCApplication5Dlg::DoDataExchange(CDataExchange*?pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX,?IDC_EDIT1,?text1);DDX_Text(pDX,?IDC_STATIC1,?lable1); }BEGIN_MESSAGE_MAP(CMFCApplication5Dlg,?CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK,?&CMFCApplication5Dlg::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL,?&CMFCApplication5Dlg::OnBnClickedCancel)ON_STN_CLICKED(IDC_STATIC1,?&CMFCApplication5Dlg::OnStnClickedStatic1) END_MESSAGE_MAP()//?CMFCApplication5Dlg?消息處理程序BOOL?CMFCApplication5Dlg::OnInitDialog() {CDialogEx::OnInitDialog();//?將“關于...”菜單項添加到系統菜單中。//?IDM_ABOUTBOX?必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX?&?0xFFF0)?==?IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX?<?0xF000);CMenu*?pSysMenu?=?GetSystemMenu(FALSE);if?(pSysMenu?!=?NULL){BOOL?bNameValid;CString?strAboutMenu;bNameValid?=?strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if?(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,?IDM_ABOUTBOX,?strAboutMenu);}}//?設置此對話框的圖標。??當應用程序主窗口不是對話框時,框架將自動//??執行此操作SetIcon(m_hIcon,?TRUE); //?設置大圖標SetIcon(m_hIcon,?FALSE); //?設置小圖標//?TODO:??在此添加額外的初始化代碼dict_size?=?open_dict(&p,"dict.txt");//根據命令行第一個參數做為字典文件名,打開字典文件if?(dict_size?==?0)exit(0);//打開字典文件失敗,程序退出return?TRUE;??//?除非將焦點設置到控件,否則返回?TRUE }void?CMFCApplication5Dlg::OnSysCommand(UINT?nID,?LPARAM?lParam) {if?((nID?&?0xFFF0)?==?IDM_ABOUTBOX){CAboutDlg?dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID,?lParam);} }//?如果向對話框添加最小化按鈕,則需要下面的代碼 //??來繪制該圖標。??對于使用文檔/視圖模型的?MFC?應用程序, //??這將由框架自動完成。void?CMFCApplication5Dlg::OnPaint() {if?(IsIconic()){CPaintDC?dc(this);?//?用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND,?reinterpret_cast<WPARAM>(dc.GetSafeHdc()),?0);//?使圖標在工作區矩形中居中int?cxIcon?=?GetSystemMetrics(SM_CXICON);int?cyIcon?=?GetSystemMetrics(SM_CYICON);CRect?rect;GetClientRect(&rect);int?x?=?(rect.Width()?-?cxIcon?+?1)?/?2;int?y?=?(rect.Height()?-?cyIcon?+?1)?/?2;//?繪制圖標dc.DrawIcon(x,?y,?m_hIcon);}else{CDialogEx::OnPaint();} }//當用戶拖動最小化窗口時系統調用此函數取得光標 //顯示。 HCURSOR?CMFCApplication5Dlg::OnQueryDragIcon() {return?static_cast<HCURSOR>(m_hIcon); }void?CMFCApplication5Dlg::OnBnClickedOk() {//?TODO:??在此添加控件通知處理程序代碼//CDialogEx::OnOK();char?key[2048];char?content[2048];memset(key,?0,?sizeof(key));memset(content,?0,?sizeof(content));UpdateData(TRUE);//將用戶在edit控件中輸入的文字放入text1這個變量中CStringA?key_a(text1);//將寬碼轉GBKstrcpy(key,key_a);if?(search_dict(p,?dict_size,?key,?content)){lable1?=?content;}else{lable1?=?L"找不到";}UpdateData(FALSE); //將lable1的內容同步到控件}void?CMFCApplication5Dlg::OnBnClickedCancel() {//?TODO:??在此添加控件通知處理程序代碼CDialogEx::OnCancel(); }void?CMFCApplication5Dlg::OnStnClickedStatic1() {free_dict(p,?dict_size);//釋放內存//?TODO:??在此添加控件通知處理程序代碼 }QT部分代碼:
完整代碼在云盤,51cto目錄
QT部分代碼:
#include?"widget.h" #include?"ui_widget.h" #include?<QTextCodec>#define?MAX?111111?//最大記錄數struct?dict {char?*key;char?*content; };struct?dict?*p?=?NULL; int?dict_size?=?0;//打開字典文件,并讀取文件內容 int?open_dict(struct?dict?**p,?const?char?*dict_filename) {FILE?*pfile?=?fopen(dict_filename,?"r");if?(p?==?NULL)return?0;//打開文件失敗,函數返回*p?=?(struct?dict?*)malloc(sizeof(struct?dict)?*?MAX);//固定分配MAX大小內存memset(*p,?0,?sizeof(struct?dict)?*?MAX);//將分配內存初始化為0struct?dict?*pD?=?*p;//pD指向數組p的首地址char?buf[1024]?=?{?0?};size_t?len?=?0;int?i?=?0;//計數器while?(!feof(pfile))//循環讀取文件,直到文件末尾{memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);//讀取文件一行len?=?strlen(buf);//得到讀取到字符串長度if?(len?>?0){pD[i].key?=?(char?*)malloc(len);//根據字符串長度分配內存memset(pD[i].key,?0,?len);strcpy(pD[i].key,?&buf[1]);//將讀取到的內容拷貝到key中}memset(buf,?0,?sizeof(buf));fgets(buf,?sizeof(buf),?pfile);len?=?strlen(buf);if?(len?>?0){pD[i].content?=?(char?*)malloc(len);memset(pD[i].content,?0,?len);strcpy(pD[i].content,?&buf[6]);}i++;//計數器加1}fclose(pfile);//關閉字典文件return?i;//返回讀取到的字典詞條數 }//根據關鍵字key,在字典中查找內容 int?search_dict(const?struct?dict?*p,?int?size,?const?char?*key,?char?*content) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//遍歷字典{if?((p[i].key?==?NULL)?||?(p[i].content?==?NULL))continue;if?(strncmp(p[i].key,?key,?strlen(key))?==?0){strcpy(content,?p[i].content);return?1;//找到符合條件記錄,返回1}}return?0;//沒有找到符合條件記錄,返回0 }//釋放內存 void?free_dict(struct?dict?*p,?int?size) {int?i?=?0;for?(i?=?0;?i?<?size;?i++)//循環釋放key與content成員內存{if?(p[i].key)free(p[i].key);if?(p[i].content)free(p[i].content);}free(p);//釋放p內存 }Widget::Widget(QWidget?*parent)?:QWidget(parent),ui(new?Ui::Widget) {dict_size?=?open_dict(&p,?"D:\\dict.txt");ui->setupUi(this); }Widget::~Widget() {free_dict(p,?dict_size);delete?ui; }void?Widget::on_pushButton_clicked() {QTextCodec?*codec?=?QTextCodec::codecForName("GBK");char?content[1024]?=?{0};//codec->fromUnicode(ui->lineEdit->text());//將edit1的內容轉化為GBKif?(search_dict(p,?dict_size,?codec->fromUnicode(ui->lineEdit->text()).data(),?content))//根據用戶輸入,在字典中檢索{//codec->toUnicode(content);//把content從GBK編碼轉化為UTF8ui->label->setText(codec->toUnicode(content));}?else{ui->label->setText("not?found");} }轉載于:https://blog.51cto.com/990487026/1788347
總結
以上是生活随笔為你收集整理的C语言 英汉互译电子词典 命令行,MFC,QT 3种版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于STM32的智能点餐系统
- 下一篇: MIPI接口与LVDE接口的区别