多的不说,直接上代码:

里面涉及的字典文件在这:这是传送门,下载下来以后把该文件放在工程目录下即可

 #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;
}; //去掉字符串结尾的回车,空格字符
void format_string(char *str)
{
size_t i;
for (i = strlen(str) - ; i >= ; i--)
{
if (str[i] != '\n' && str[i] != ' ' &&str[i] != '\r')
{
str[i + ] = '\0';
break;
}
}
} //打开字典文件,并读取文件内容
int open_dict(struct dict **p, const *dict_filenaem)
{
FILE *pfile = fopen(dict_filenaem, "r");
if (pfile == NULL)
return ;//文件打开失败,函数返回 *p = (struct dict *)malloc(sizeof(struct dict) * MAX);//固定分配MAX大小内存
memset(*p, , sizeof(struct dict)*MAX);//将分配内存初始化为0 char buf[] = { };
size_t len = ;
int i = ;//计数器
while (!feof(pfile))//循环读取文件,直到文件末尾
{
memset(buf, , sizeof(buf));
fgets(buf, sizeof(buf), pfile);//读取文件一行
len = strlen(buf);//得到读取到字符串长度
if (len > )
{
(*p)[i].key = (char *)malloc(len);//根据字符串长度分配内存
memset((*p)[i].key, , len);
format_string(buf);//去掉字符串结尾的空格和回车
strcpy((*p)[i].key, &buf[]);//将读取的内容拷贝到key中
} memset(buf, , sizeof(buf));
fgets(buf, sizeof(buf), pfile);
len = strlen(buf);
if (len > )
{
(*p)[i].content = (char *)malloc(len);
memset((*p)[i].content, , len);
strcpy((*p)[i].content, &buf[]);
} i++;
} fclose(pfile);//关闭字典文件 return i;//返回读取到的字典词条数 } //根据关键字key,在字典中查找内容
int search_dict(const struct dict *p, int size, const char *key, char *content)
{
int i = ;
for (i = ; i < size; i++)//遍历字典
{
if ((p[i].key == NULL) || (p[i].content) == NULL)
continue; if (strcmp(p[i].key, key) == )
{
strcpy(content, p[i].content);
return ;//找到符合条件记录,返回1
}
} return ;//没有找到符合条件记录,返回0
} //释放内存
void free_dict(struct dict *p, int size)
{
int i = ;
for (i = ; i < size; i++)
{
if (p[i].key)
{
free(p[i].key);
}
if (p[i].content)
{
free(p[i].content);
}
}
free(p);//释放p内存
} int main()
{ struct dict *p = NULL; int dict_size = open_dict(&p, "dict.txt"); char key[];
char content[];
while ()
{
memset(key, , sizeof(key));
memset(content, , sizeof(content));
fgets(key, sizeof(key),stdin);//从键盘得到用户输入
format_string(key);
if (strncmp(key, "command=exit", ) == )
break; if (search_dict(p, dict_size, key, content))//根据用户输入在字典中检索
{
printf("%s", content);
}
else
{
printf("not found\n");
}
}
system("pause");
return ;
}

下面是移植到QT上的界面程序:传送门,移植很简单,但是要注意QT采用 的是UTF8编码,而windows的记事本是采用GBK编码,所以需要进行编码转化

  • 步骤如下
  • 1.添加头文件<QTextCodec>
  • 2.建立一个从UTF8到GBK转化的桥梁:QTextCodec *codec = QTextCodec::codecForName("GBK");
  • 3.转化成GBK编码,然后copy到char数值中进行操作 strcpy(key,codec->fromUnicode(ui->lineEdit->text()));

如果要把GBK编码转化成utf8编码,则需要一个操作即可codec->toUnicode(content),上代码

 void Widget::on_pushButton_clicked()
{
QTextCodec *codec = QTextCodec::codecForName("GBK");//建立一个从UTF8到GBK转化的桥梁
char key[] = {};
char content[] = {};
//ui->lineEdit->text();//得到用户在edit中输入的内容,类型是QString,QString是QT提供的一个字符串类
//qt默认的字符串都是UTF8编码
strcpy(key,codec->fromUnicode(ui->lineEdit->text()));
format_string(key); if (search_dict(p, dict_size, key, content))//根据用户输入在字典中检索
{
//content内容是GBK格式的字符串
ui->label->setText(codec->toUnicode(content));//把GBK编码转化成UTF8格式
}
else
{
ui->label->setText("not found");
}
}

6.C语言文件操作之英语电子字典的实现,dos版的更多相关文章

  1. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  2. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  3. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  4. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  5. C语言文件操作解析(五)之EOF解析(转载)

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  6. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  8. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  9. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

随机推荐

  1. POJ 2183

    模拟题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std ...

  2. 【转载】黑客内核:编写属于你的第一个Linux内核模块

    黑客内核:编写属于你的第一个Linux内核模块

  3. 怎样用批处理来执行多个exe文件

    怎样用批处理来运行多个exe文件 @echo off start *****.exe start *****.exe start *****.exe start *****.exe 接着我们就能够运行 ...

  4. 构建自己的AngularJS - 作用域和Digest(三)

    作用域 第一章 作用域和Digest(三) $eval - 在当前作用域的上下文中运行代码 Angular有多种方式让你在当前作用域的上下文中运行代码.最简单的是$eval.传入一个函数当做其參数.然 ...

  5. hdoj--4501--小明系列故事——买年货(三维背包)

    小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota ...

  6. caffe中lenet_solver.prototxt配置文件注解

    caffe框架自带的例子mnist里有一个lenet_solver.prototxt文件,这个文件是具体的训练网络的引入文件,定义了CNN网络架构之外的一些基础参数,如总的迭代次数.测试间隔.基础学习 ...

  7. Springboot如何利用http请求控制器

    写好了接口,现在想用postman测试一下这个接口是否正确,想请问怎么传入请求参数?先谢谢了! Springboot如何利用http请求控制器 >> java这个答案描述的挺清楚的:htt ...

  8. HCF4094(CD4094)应用

    管脚说明和内部逻辑图 注:管脚图为HCF4094,内部逻辑图为CD4094(HCF4094内部逻辑图在datasheet不清晰,且复杂). 其中控制管脚有3个:STROBE-DATA-CLOCK,Ou ...

  9. POJ 2976 Dropping tests【二分 最大化平均值】

    题意:定义最大平均分为 (a1+a2+a3+---+an)/(b1+b2+---+bn),求任意去除k场考试的最大平均成绩 和挑战程序设计上面的最大化平均值的例子一样 判断是否存在x满足条件 (a1+ ...

  10. php计算两个日期相差的天数

    /** * 时间差计算 * * @param Timestamp $time * @return String Time Elapsed */ function time2Units ($time,$ ...