首先搭建数据库框架,再打开要存入的文件,这边用的是英语四级常用单词词典

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


int main(int argc, const char *argv[])
{
	//打开数据库
	sqlite3* db = NULL;
	if(sqlite3_open("./my.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("数据库打开成功\n");
	//打开文件
	int fd = open("./dict.txt", O_RDONLY);  //只读打开
		
	//创建数据库表格
	char* sql = "create table if not exists engdic (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;
	}
//功能段--------------------------------------------------------------




//--------------------------------------------------------------------
//关闭数据库
	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("数据库成功关闭\n");
	//关闭文件
	close(fd);

	return 0;
}


要注意的点不多

1:有部分特殊单词,如mass media,虽然单词中间有空格,但是其实是一个单词

2:o'clock,此单词不能用单引号,要用双引号包裹

我采取一个一个取的方法

    char c;
	char word[30] = "";      //存单词
	char mean[60] = "";      //存翻译
	char buf[128] = "";      //存入全部
	int flag = 0;
	ssize_t res = 0;
	while(1)
	{
		//单词提取循环
		while(1)
		{
			res = read(fd, &c, 1);
			if(res == 0)     //读完以后退出
				break;
			if(' ' == c)    //监测到空格,flag++;
			{
				flag++;
			}else           //如果空格的后一位不是空格,重置flag
			{
				flag = 0;
			}

			if(flag > 1)   //超过两个空格了
			{
				word[strlen(word)-2] = '\0';  //把之前输入的空格换成'\0'
				break;                      //进入下一个中文循环
			}
			strcat(word, &c);   //存入数组
		}

		//中文翻译循环
		while(1)
		{
			res = read(fd, &c, 1);
			if(res == 0)           //读完以后退出
				break;
			if(flag>1 && ' '==c)   //跳过单词和翻译中间的多余空格
				continue;
			else
				flag = 0;          //当c不再是空格时,重置flag,并开始装填
			strcat(mean, &c);      
			if(c == '\n')          //取完这一行,跳出循环,重新开始取单词
				break;
		}
		
		//当代码运行到此处时,word与mean已经填充完成一行单词
		//填充入数据库,并清空字符串
		//装填入buf字符串数组
		if(word[0] == '\0')     //若没有读出数据,退出
			break;  
		sprintf(buf, "insert into engdic values(\"%s\", '%s');",word, mean);
		//存入数据库
		char* errmsg = NULL;
		if(sqlite3_exec(db, buf, NULL, NULL, &errmsg) != SQLITE_OK)
		{
			fprintf(stderr, "__%d__ sqlite3_exec:%s\n", __LINE__, errmsg);
			return -1;
		}

		//清空buf,word,mean
		bzero(buf, sizeof(buf));
		bzero(word, sizeof(word));
		bzero(mean, sizeof(mean));
	}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐