多的不说,直接上代码:

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

 #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. HDU 2686 Matrix(最大费用最大流+拆点)

    题目链接:pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686 和POJ3422一样 删掉K把汇点与源点的容量改为2(由于有 ...

  2. github上Devstack的一些变动,截至8.20

    从github下直接clone下来的代码在执行之前须要对一些文件进行改动,否则会出现关于REQUIREMENTS的错误 说明:代码前边是"-"号的,须要删除,代码前边是" ...

  3. web程序定时器

    package com.timer; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ...

  4. HTTP Status 404 - /servlet/Item/AddItemServlet

    我想学习编程的人对404和500都是非常敏感非常熟悉的.在做DRP系统的时候多次遇到这两个错误,今天让我遇到他并且让我铭记他,那就是一个"/": 这是说jsp出问题了,并且找不到, ...

  5. C/S和B/S交互

    近期一直在做C/S的项目,每天都超忙,抽个时间写篇博客,之前一直做C/S项目就是各种窗口.各种控件,拖来拖去,然后点进去写方法,做BS的时候呢,由于一直使用的是mvc,所以就是常常手写代码.或者拖引用 ...

  6. node10---GET请求和POST请求的参数

    GET请求的参数在URL中,在原生Node中,需要使用url模块来识别参数字符串.在Express中,不需要使用url模块了.可以直接使用req.query对象. ● POST请求在express中不 ...

  7. 在Visual Studio Code中使用C#以及.net core

    Working with C# Using .NET Core in Visual Studio Code Note: VS Code does not support debugging appli ...

  8. POJ 3469 Dinic (二元关系)

    题意: 思路: //By SiriusRen #include <queue> #include <cstdio> #include <cstring> using ...

  9. kettle工具的设计原则

    不多说,直接上干货! Kettle工具在设计初,就考虑到了一些设计原则.这些原则里借鉴了以前使用过的其他一些ETL工具积累下的经验和教训. 易于开发:作为数据仓库和ETL开发者,你只想把时间用在创建B ...

  10. ksh简介

    -- Start 什么是 Shell 如果把 Linux 比作一个蛋,那么 Shell 就是蛋壳,我们需要通过 Shell 来使用系统. Shell 的种类 最早的 Shell 是 Bourne Sh ...