c语言关键字中英翻译机,要求创建文件搜索 5
程序使用结构链表实现。
由于我写的函数已经自动识别中英文输入,中英文翻译功能其实可以合并成一个选项(3,4选项),但你题目既然要求2项目,所以没合并。
根据题目,创建字典是覆盖性,既每次创建输入,都会覆盖掉原文件,但考虑后期扩展,我的函数writeFile可以不覆盖,在原文件后新增,具体看备注。
菜单显示是利用递归函数,如果你想新增功能,参照我选项改。
(另外所有函数异常,我都是采取抛出,没有处理,你想处理根据我的函数返回值写处理吧!)
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define FPATH "C:\\keyWord.txt"
typedef struct keyWord
{
char kwCN[20];// 中文名
char kwEN[10];// 英文名
struct keyWord *next;
}KW;
void freeKWS(KW *kwsHead);//释放链表内存
int createDictionary(char *path);//创建字典。成功返回1 失败返回0
int writeFile(char *path,KW *kwsHead,int flag);//写入文件。成功返回1,失败返回0。flag:0新增;1修改或删除
KW *readFile(char *path);//读取文件。成功返回头节点,失败返回NULL。
int isCN(char *strCN);//判断字符串是否是全中文,是返回1,否返回0
void showKWS(char *path,char*keyCN,char *keyEN);//参数全部传NULL打印整个链表。keyCN!=NULL打印对应英文,keyZN!=NULL打印对应中文
void showMenu(int n);//递归函数打印菜单,第一次调用传值-1
void selectByKey(char *keyN);//输入中文输出英文,输入英文输出中,自动识别中英文关键字
int main()
{
//createDictionary("C:\\keyWord.txt");
//showKWS(NULL,NULL);
showMenu(-1);
}
void showMenu(int n)//打印菜单
{
char cn[20],en[10];
switch(n)
{
case 1:
createDictionary(FPATH);
break;
case 2:
printf("当前中英文词典的内容:\n");
showKWS(FPATH,NULL,NULL);
break;
case 3:
printf("请输入英文关键字:");
scanf("%s",en);
getchar();
selectByKey(en);
break;
case 4:
printf("请输入中文关键字:");
scanf("%s",cn);
getchar();
selectByKey(cn);
break;
case 5:
exit(0);
break;
case -1:
while(1)
{
system("cls");
printf("|***********************电子词典模拟软件***********************|\n");
printf("1、创建关键字中英文词典\n");
printf("2、显示关键字中英文词典\n");
printf("3、输入英文关键字,查阅英汉词典\n");
printf("4、输入中文关键字,查阅汉英词典\n");
printf("5、退出\n");
printf("|*********************All rights reserved**********************|\n");
printf("请选择菜单中的1或2或3或4或5\n");
scanf("%d",&n);
getchar();
showMenu(n);
}
break;
}
n=-1;
printf("----------按任意键返回上级菜单-----------\n");
getchar();
}
void selectByKey(char *keyN)//输入中文输出英文,输入英文输出中,自动识别中英文关键字
{
if(isCN(keyN))
showKWS(FPATH,keyN,NULL);
else
showKWS(FPATH,NULL,keyN);
}
int isCN(char *strCN)//判断字符串是否包含中文,是返回1,否返回0
{
char *p=strCN;
while(*p!=0)
{
if((*p&0x80)==0x80)
return 1;
p++;
}
return 0;
}
void showKWS(char *path,char *keyCN,char *keyEN)//参数全部传NULL打印整个链表。keyCN!=NULL打印对应英文,keyZN!=NULL打印对应中文
{
KW *kwsHead=NULL;
kwsHead=readFile(path);
if(kwsHead)
while(kwsHead->next)
{
if(keyCN!=NULL && keyEN==NULL && strcmp(kwsHead->next->kwCN,keyCN)==0){
printf("对应英文关键字:%s\n",kwsHead->next->kwEN);
break;
}
if(keyEN!=NULL && keyCN==NULL && strcmp(kwsHead->next->kwEN,keyEN)==0){
printf("对应中文关键字:%s\n",kwsHead->next->kwCN);
break;
}
if(keyEN==NULL && keyCN==NULL)
printf("%s %s\n",kwsHead->next->kwEN,kwsHead->next->kwCN);
kwsHead=kwsHead->next;
}
freeKWS(kwsHead);
}
int createDictionary(char *path)//创建字典。成功返回1 失败返回0
{
char cn[20],en[10];
KW *kwsHead=NULL,*kwTail=NULL,*kwNew=NULL;
kwsHead=(KW *)malloc(sizeof(KW));
if(!kwsHead)
return 0;
kwsHead->next=NULL;
printf("请输入关键字中文及英文(每行一组空格分割,输入NULL退出输入):\n");
while(1)
{
cn[0]=en[0]=0;
scanf("%s",cn);
if(strcmp(cn,"NULL")==0)
break;
scanf("%s",en);
if(strcmp(en,"NULL")==0)
break;
kwNew=(KW *)malloc(sizeof(KW));
kwNew->kwCN[0]=kwNew->kwEN[0]=0;
kwNew->next=NULL;
strcpy(kwNew->kwCN,cn);
strcpy(kwNew->kwEN,en);
if(kwsHead->next)
kwTail->next=kwNew;
else
kwsHead->next=kwNew;
kwTail=kwNew;
}
getchar();
return writeFile(path,kwsHead,1);
}
KW *readFile(char *path)//读取文件。成功返回头节点,失败返回NULL。
{
FILE *fp=NULL;
char cn[20],en[10];
KW *kwsHead=NULL,*kwTail=NULL,*kwNew=NULL;
kwsHead=(KW *)malloc(sizeof(KW));
if(!kwsHead)
return NULL;
kwsHead->next=NULL;
fp=fopen(path,"r");
if(!fp)
{
printf("文件打开失败!\n");
return NULL;
}
fseek(fp,0,SEEK_SET);
while(fscanf(fp,"%s%s",cn,en)!=-1)
{
kwNew=(KW *)malloc(sizeof(KW));
if(!kwNew)
return NULL;
kwNew->next=NULL;
strcpy(kwNew->kwCN,cn);
strcpy(kwNew->kwEN,en);
if(kwsHead->next)
kwTail->next=kwNew;
else
kwsHead->next=kwNew;
kwTail=kwNew;
}
fclose(fp);
return kwsHead;
}
int writeFile(char *path,KW *kwsHead,int flag)//写入文件。成功返回1,失败返回0。flag:0新增;1修改或删除
{
FILE *fp=NULL;
if(flag)
fp=fopen(path,"wt+");
else
fp=fopen(path,"rt+");
if(!fp)
{
printf("文件打开失败!\n");
return 0;
}
fseek(fp,0,SEEK_END);
while(kwsHead->next)
{
fprintf(fp,"%s %s\n",kwsHead->next->kwCN,kwsHead->next->kwEN);
kwsHead=kwsHead->next;
}
fclose(fp);
printf("数据写入文件成功!\n");
freeKWS(kwsHead);
return 1;
}
void freeKWS(KW *kwsHead)//释放链表内存
{
KW *kwDel=NULL;
while(kwsHead->next)
{
kwDel=kwsHead->next;
kwsHead=kwsHead->next;
free(kwDel);
}
free(kwsHead);
}