使用的数据库为sqlite3
使用的sqlite3自带的函数为
函数名 | 功能 |
sqlite3_open |
打开数据库,如果数据库不存在,则创建并打开 |
sqlite3_errmsg |
打印错误码对应的错误信息 |
sqlite3_errcode |
sqlite3_close |
sqlite3_exec |
指定一条sql语句 |
其中,使用sqlite3_exec函数完成在c语言代码中运行sqlite语句,从而实现数据的快速导入
函数原型:
int sqlite3_exec(
sqlite3* db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数:
sqlite3* db:打开的数据库;
char *sql:要被执行的sql语句;
int (*callback)(void*,int,char**,char**):函数指针,该指针指向返回值为int类型,参数列表为void*,int,char**,char**的函数;
只有在sql语句是查询语句的时候有用,其余时候填NULL;
void *arg:会被传递给回调函数的第一个参数;
char **errmsg:该二级指针指向的一级指针会指向错误信息;
基本思路为:一行一行的读取文件内容,利用单词与注释之间的多个空格将两者分割存放在不同的数组中,最后使用sprintf函数拼接成sql语句并使用sqlite3_exec函数存入数据库中。
代码实现:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
//打印错误信息的宏函数
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//打开数据库
sqlite3* db = NULL;
if(sqlite3_open("./dict.db",&db) != SQLITE_OK)
{
printf("err_code:%d\n",sqlite3_errcode(db));
printf("errmsg:%s\n",sqlite3_errmsg(db));
fprintf(stderr,"__%d__ sqlite3_open failed\n",__LINE__);
return -1;
}
printf("sqlite3_open success\n");
//创建一个表格
char* sql = "create table if not exists dir(word char, mean char);" ;
char* errmsg = NULL;
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_exec:%s\n", __LINE__, errmsg);
return -1;
}
printf("create table success\n");
//以只读方式打开原文件
int fd = open("./dict.txt",O_RDONLY);
if(fd<0)
{
ERR_MSG("open");
return -1;
}
printf("打开成功\n");
char c = ' ';
char str[40] = ""; //存放单词
char buf[128] = ""; //存放中文注释
char sql_2[256] = ""; //存放命令语句
ssize_t res;
int i=0;
//一行一行的读取文件内容并写入数据库中
while(1)
{
bzero(str,sizeof(str));
bzero(buf,sizeof(buf));
/*while(c == ' ')
{
res=read(fd,&c,1);
if(res < 0)
{
ERR_MSG("read");
}
}*/
//运行到此处说明已经读取到该行的第一个非空格字符
//这时可以将读取出的字符赋值到str数组中
//str[0] = c;
for(i=0; i<40; i++)
{
//依次读取字符
res=read(fd,&c,1);
if(res < 0)
{
ERR_MSG("read");
}
//连续的两个空格表明单词的读取已经结束
if((str[i-1] == ' ') && (c == ' '))
{
break;
}
str[i] = c;
}
str[i-1] = 0;
//剔除空格
while(c == ' ')
{
res=read(fd,&c,1);
if(res < 0)
{
ERR_MSG("read");
}
}
//运行到此处说明已经读取到该行的单词的解释的第一个字符
//这时可以将读取出的字符赋值到buf数组中
buf[0] = c;
for(i=1; i<128; i++)
{
//依次读取字符
res=read(fd,&c,1);
if(res < 0)
{
ERR_MSG("read");
}
//判断该行字符是否读取完毕
if((c == '\n') || (res == 0))
{
break;
}
buf[i] = c;
}
if(res == 0)
{
printf("数据传输完毕\n");
break;
}
//运行到此处说明单词及其中文解释分别存放在str数组和buf数组中
//接下来将其拼接到sql数组中便于后续的使用
sprintf(sql_2, "insert into dir values(\"%s\",\"%s\")",str,buf);
char* errmsg = NULL;
//将该行的数据传入数据库中
if(sqlite3_exec(db, sql_2, NULL, NULL, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_exec:%s\n", __LINE__, errmsg);
return -1;
}
}
//关闭数据库
if(sqlite3_close(db) != SQLITE_OK)
{
printf("err_code:%d\n",sqlite3_errcode(db));
printf("errmsg:%s\n",sqlite3_errmsg(db));
fprintf(stderr,"__%d__ sqlite3_close failed\n",__LINE__);
return -1;
}
printf("sqlite3_close success\n");
//关闭文件
close(fd);
return 0;
}