电子词典知识准备 超详细( 二)——从文件内读写查找指定内容

目录

关键字:

文件流的打开与关闭()

(fopen & fclose)

单词的大小写处理及程序退出

关键字的查找与输出

查找(Binary_search):

输出

完整代码:

字典文档:dictionary.txt

 运行效果GIF:​

编写过程遇到的一些问题 :

1、编译出现警告: the `gets' function is dangerous and should not be used. 

解决办法:

2、程序运行出现中文乱码

解决办法:


 


关键字:

文件流的打开与关闭()

(fopen & fclose)

FILE *fp;
	fp = fopen("dictionary.txt", "r");//打开文件
	if (fp == NULL)
	{
		printf("Please check the file situction."); //文件打开问题处理
		exit(0);
	}
	else
	{
		while (!feof(fp))
		{
			fscanf(fp, "%s%s", e[w], c[w]); //把数据读入到数组里保存
			w++;
		}
		fclose(fp);
	}

单词的大小写处理及程序退出

while(1)
    {
        flag = 1;
        printf("请输入你想查找的单词\n");
        printf("\n");
       // fgets(s,99,stdin);//输入要查找的单词
        gets(s);
        int x = 0, m = -1;
        while(s[x] !='\0')
        {
            if(s[x]!= ' '&&m != -1)
            {
                s[m] = s[x];
                m++;
            }
            else if(s[x] == ' '&& m == -1)//删除空格
            {
                m = x;
            }
            x++;
        }
        if(m != -1)
        {
            s[m] = '\0';
        }
        t = strlen(s);
        for(i = 0;i < t;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')//大写转小写
            {
                s[i] +=32;
                flag = 0;
            }
        }
        if(strcmp(s,"0000")==0)//退出判断
        {
            break;
        }
        else
     [
        
             i= Binary_search(s);//二分法查找目标单词
            if(i==0)
            {
                printf("对不起,无法查询到您所需要的单词,请重新输入另一个单词:\n");
            }
            else 
            if(flag == 0)
            {
                printf("\n");
                printf("这个单词的释意是'%s':%s",s,c[i]);
                printf("\n");//输入大写转小写输出提示信息
            }
            else
            {
                printf("\n");
                printf("'%s'is %s\n",s,c[i]);
                printf("\n");
            }
            printf("\n");
    }
        

关键字的查找与输出

查找(Binary_search):

int Binary_Seareh(char p[999])
{
	int low = 0, mid, high = w - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (strcmp(e[mid], p) == 0) //利用strcmp函数对输入进来的单词与文件中单词比对
		{
			return mid;
		}
		if (strcmp(e[mid], p) > 0)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	return 0;
}

输出

完整代码:

字典文档:dictionary.txt

/*************************************************************************
	> File Name: dictionary.c
	> Author: 
	> Mail: 
	> Created Time: 2018年12月13日 星期四 17时02分32秒
 ************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int w =0;
int  Binary_search(char p[999]);
char e[9999][999],c[9999][999];//用两个数组分别从文件中读入英文和汉译

int Binary_search(char p[999])
{
    int low=0,mid,high=w-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(strcmp(e[mid],p)==0) //利用strcmp函数对输入进来的单词与文件中单词比对
        {
            return mid;
        }
        if(strcmp(e[mid],p)>0)
        {
            high=mid-1;
        }
        else
        {
            low=mid+1;
        }
    }
    return 0;
}

int main()
{
    int i,n,m,j,k,t;
    int flag;//标记大小写
    char s[99],ss[99];
    printf("###################################################\n");
    printf("#########                               ###########\n");
    printf("#######                                    ########\n");
    printf("#####         欢迎使用典典英汉词典           ######\n");
    printf("#######                                    ########\n");
    printf("#########                               ###########\n");
    printf("###################################################\n");
    FILE *fp;
    fp = fopen("dictionary.txt","r");//打开字典文件
    if(fp == NULL)
    {
        perror("请检查一下文件状态");
        exit(0);
    }
    else
    {
        while(!feof(fp))
        {
            fscanf(fp,"%s%s",e[w],c[w]);//把数据读入到数组里保存
            w++;
        }
        fclose(fp);
    }
    printf("\n");
    printf("如果你想退出请输入'0000'\n");
    printf("\n");
    while(1)
    {
        flag = 1;
        printf("请输入你想查找的单词\n");
        printf("\n");
       // fgets(s,99,stdin);//输入要查找的单词
        gets(s);
        int x = 0, m = -1;
        while(s[x] !='\0')
        {
            if(s[x]!= ' '&&m != -1)
            {
                s[m] = s[x];
                m++;
            }
            else if(s[x] == ' '&& m == -1)//删除空格
            {
                m = x;
            }
            x++;
        }
        if(m != -1)
        {
            s[m] = '\0';
        }
        t = strlen(s);
        for(i = 0;i < t;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')//大写转小写
            {
                s[i] +=32;
                flag = 0;
            }
        }
        if(strcmp(s,"0000")==0)//退出判断
        {
            break;
        }
        else
        {
            i= Binary_search(s);//二分法查找目标单词
            if(i==0)
            {
                printf("对不起,无法查询到您所需要的单词,请重新输入另一个单词:\n");
            }
            else 
            if(flag == 0)
            {
                printf("\n");
                printf("这个单词的释意是'%s':%s",s,c[i]);
                printf("\n");//输入大写转小写输出提示信息
            }
            else
            {
                printf("\n");
                printf("'%s'is %s\n",s,c[i]);
                printf("\n");
            }
            printf("\n");
        }
    }
    printf("欢迎下次使用\n");;
}

 运行效果GIF:

编写过程遇到的一些问题 :

gcc dictionary.c -o dictionary

1、编译出现警告: the `gets' function is dangerous and should not be used. 

(虽然能够运行,但是作为一名严谨的程序猿,还是用正规主流的用法)

如下:

dictionary.c: In function ‘main’:
dictionary.c:73:9: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
         gets(s);
         ^~~~
         fgets
/tmp/ccfIc8bN.o:在函数‘main’中:
dictionary.c:(.text+0x218): 警告: the `gets' function is dangerous and should not be used.

解决办法:

  问题出在程序中使用了 gets  ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets,用法如下。

 char *fgets(char *s, int size, FILE *stream);//eg:可以用fgets(tempstr,10,stdin)//tempstr 为char[]变量,10为要输入的字符串长度,stdin为从标准终端输入。

2、程序运行出现中文乱码

解决办法:

在wendows下将文档另存为UTF-8编码

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值