linux下结合sqlite3做一个英语查询字典小项目

首先,在Linux下创建一个数据库:输入 sqlite3 dic.db 

这样数据库就创建完毕,接下来就在代码中实现了

先画个图理清楚思路


现在上代码

/*************************************************************************
	> File Name: datian.c
	> Author: 
	> Mail: 1014641914qq.com
	> Created Time: 2015年08月23日 星期日 18时36分47秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sqlite3.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

/**
 *	path文件的路径(当前目录直接写,不在当前目录则加上绝对路径)
 *	mode 表示权限(不懂的就 man fopen)
 */
void getFile(const char *path,const char *mode)
{
	//创建字符数组,用于接收读取每行的数据
	char line[256];
	//创建文件描述符
	FILE *fp;
	//接收打开的文件
	if((fp = fopen(path, mode)) == NULL)
	{	
		//如果文本不存在,打印错误信息并且返回
		perror("fopen");
		exit(-1);
	}
	printf("--------------open file success-----------\n");
	//文件存在则一每行读取
	while(fgets(line,256,fp))
	{
		printf("%s",line);
	}
	//关闭文件
	fclose(fp);

}

//创建表
int createTable(sqlite3 *db , char *tableName)
{
/** int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *,  char **errmsg );
 *	第1个参数不再说了,是前面open函数得到的指针。
 *	第2个参数const char*sql是一条sbql 语句,以\0结尾。
 *	第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
 *	第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,
 *	   这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
 *	第5个参数char** errmsg 是错误信息。
 */
	char *errmsg;
	//若有此表,先移除   sqlite3_exec 方法表示执行 
	sqlite3_exec(db, "drop table diction", NULL, NULL, &errmsg);
	//创建表的sql语句 第3,4个参数暂时用不上,等下我们再看回调函数的写法,以及这个参数的使用 现在先写为NULL 
	char *sql = "create table diction(word text, mean text)";	
	//创建表的失败 ,返回-1
	if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("sqlite3_exec : %s", errmsg);
		return -1;
	}
	printf("create table success \n");
	return 0; 
}

int insert(sqlite3 *db,const char *path,const char *mode)
{
	//把上面的读取文本的代码拷贝下来了
	char line[256];
	FILE *fp;
	if((fp = fopen(path, mode)) == NULL)
	{	
		perror("fopen");
		exit(-1);
	}
	/**
		在这里处理字符串,并将其插入数据中
		为什么要处理字符串?因为字符串中有特殊的符号 ' 单引号
		数据库插入数据时要用 单引号 做标志
		所以我们的数据中含有 ' 时需要转义 --> 用两个单引号表示是单引号
		类似于一个 \表示换行 \\表示一个 \
	*/
	char *p;
	char saveDic[64];
	char saveMeans[512];
	char sql[1024];//保存sql语句
	while(fgets(line,256,fp))
	{	
		//p指向line首地址
		p = line;
		//安全起见,在最末尾加 \0
		line[strlen(line) - 1] = '\0';
		//检查line中是否所有单引号,有的话再给它加一个单引号
		//文本的每条数据类型均为:abed             In bed; on a bed. (单词  一串空格  解释) 
		//从每行的头开始 到 遇到空格为止 是一个单词  遍历空格 到遇到不是空格为止是内容
		int position = 0;//saveDic 的下标
		while((*p) != ' ')
		{
			//保存单词到saveDic中,遇到单引号给它再加以一个
			saveDic[position] = *p;
			if(saveDic[position] == '\'')
			{
				position++;
				saveDic[position] = '\'';		
			}
			p++;
			position++;
		}
		//最后一个'\0'没有复制,给它添上
		position++;
		saveDic[position] = '\0';
		//printf("%s\n", saveDic);
		//跳过中间空格
		while((*p) == ' ')
		{
			p++;
		}
		p++;
		position = 0;
		while((*p) != '\0')
		{
			//保存单词到saveMeans中,遇到单引号给它再加以一个
			saveMeans[position] = *p;
			if(saveMeans[position] == '\'')
			{
				position++;
				saveMeans[position] = '\'';		
			}
			p++;
			position++;
		}
		//最后一个'\0'没有复制,给它添上
		position++;
		saveMeans[position] = '\0';
		printf("%s\n", saveMeans);
		//拼接字符串
		sprintf(sql,"insert into diction values('%s','%s')",saveDic,saveMeans);
		//向数据库插入数据
		if(sqlite3_exec(db,sql,NULL,NULL,NULL) == SQLITE_OK);
			//printf("insert success\n");
		//else
			//perror("insert fail\n");		
	}
	fclose(fp);

}


int main()
{
	//文件的绝对路径,当前文件下可以不加路径
	const char *path = "new.txt.tostudent";
	//文件的可读权限
	const char *mode = "r";
	//getFile(path,mode);
	char * dbName = "dic.db";
	char * tableName = "youWant";
	sqlite3 *db;
	//打开数据库
	if(sqlite3_open(dbName,&db) != SQLITE_OK)
	{
		//如果数据库不存在,副会错误信息
		perror("SQLite3_open");
		exit(-1);
	}
	printf("open db success\n");
	createTable(db , tableName);
	insert(db,path,"r");
	//关闭数据库
	sqlite3_close(db);

	return 0;
}

其实细心的你可能会发现,处理字符串 单词和解释的方法是一样的,可以抽取出来,你们自己抽取吧



图1:

现在读取的是文件的单词部分,还没有处理字符串的部分

图2:

这是经过处理的字符串,一个单引号变为两个,这样在插入数据库数才不会报错

图3:


这是经过处理的解释意思一个单引号变为两个,附上源文件图片


好了,现在查看一下我们数据库有没有这些数据



看到我们创建的表了吗
这是我们数据库里面的数据,显示的比较丑
数据库操作不熟悉的请自己百度
请关注下一篇-------->服务端与客户端的通信
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章