首先,在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:
这是经过处理的解释意思一个单引号变为两个,附上源文件图片
好了,现在查看一下我们数据库有没有这些数据
看到我们创建的表了吗
这是我们数据库里面的数据,显示的比较丑
数据库操作不熟悉的请自己百度
请关注下一篇-------->服务端与客户端的通信