多的不说,直接上代码:

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

 #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. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER

    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER ...

  2. Android程序之全国天气预报查询(聚合数据开发)

    一.项目演示效果例如以下: 项目源码下载地址: http://pan.baidu.com/s/1pL6o5Mb password:5myq 二.使用 聚合数据SDK: (1)聚合数据官网地址:http ...

  3. LintCode-交叉字符串

    给出三个字符串:s1.s2.s3,推断s3是否由s1和s2交叉构成. 您在真实的面试中是否遇到过这个题? Yes 例子 比方 s1 = "aabcc" s2 = "dbb ...

  4. C++继承中析构函数 构造函数的调用顺序以及虚析构函数

    首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  5. Math类概述及其成员方法

    Math 类包括用于运行基本数学运算的方法,如初等指数.对数.平方根和三角函数,这个类寻常开发中用的不多,可是在某些需求上会用到,比方求二个用户年龄的相差多少岁,这会用到Math类中的方法!如今把Ma ...

  6. ThinkPHP5.0最最最最最简单实例

    ThinkPHP5.0最最最最最简单实例 一.效果图 二.操作步骤 1.用mysql数据库建立数据库 2.按照ThinkPHP官网的指示装好ThinkPHP5.0 tp5里面的目录结构如下: 3.配置 ...

  7. python 提取主域名和子域名代码——先根据规则提取,如果有问题,则使用tldextract

    import tldextract def extract_domain(domain): suffix = {'.com','.la','.io', '.co', '.cn','.info', '. ...

  8. [JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)

    题目链接: http://172.16.0.132/senior/#contest/show/2523/0 题目: 题解:(部分内容来自https://blog.csdn.net/gmh77/arti ...

  9. Z 字形变换 C++实现 java实现 leetcode系列(六)

    Z 字形变换  java实现 C++实现  将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...

  10. 你不知道的JavaScript(六)Box&Unbox

    很多语言中都有Box和Unbox的概念,很多书籍把Box翻译为"装箱操作",指的是將基本数据类型包装成对象:Unbox和它相反,把对象类型转换为基本类型. 我们知道JavaScri ...