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:


這是經過處理的解釋意思一個單引號變爲兩個,附上源文件圖片


好了,現在查看一下我們數據庫有沒有這些數據



看到我們創建的表了嗎
這是我們數據庫裏面的數據,顯示的比較醜
數據庫操作不熟悉的請自己百度
請關注下一篇-------->服務端與客戶端的通信
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章