首先,在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;
}
其實細心的你可能會發現,處理字符串 單詞和解釋的方法是一樣的,可以抽取出來,你們自己抽取吧
現在讀取的是文件的單詞部分,還沒有處理字符串的部分