【网络编程】学习成果day7:用sqlite3和fgetc将字典写入数据库中的数据表。

1.将字典写入数据库中的数据表

代码:

c 复制代码
linux@linux:~/study/NETbc$ cat 03_dictsqlite3.c 
#include<myhead.h>
#define MAX 50

int do_insert(sqlite3* db);

int main(int argc, const char *argv[])
{
	//打开数据库
	sqlite3 *db=NULL;
	if(sqlite3_open("./dict.db",&db)!=SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_open:%s %d __%d__\n",\
				sqlite3_errmsg(db),sqlite3_errcode(db),__LINE__);
		return -1;
	}

	//创建表格
	char sql[128]="create table if not exists stu (word char,mean char);";
	char* errmsg=NULL;
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_exec:%s __%d__\n",errmsg,__LINE__);
		return -1;
	}
	printf("create table stu success\n");

	//调用插入数据函数,创建数据表并将英文字典文本文件的单词和意思导入的数据表中
	do_insert(db);

	//关闭数据库
	if(sqlite3_close(db) != SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_close:%s %d __%d__\n",\
				sqlite3_errmsg(db),sqlite3_errcode(db),__LINE__);
		return -1;
	}
	printf("sqlite3_close success\n");

	return 0;
}

//插入数据
int do_insert(sqlite3* db)
{
	//打开文件操作
	FILE *fp;
	fp=fopen("dict.txt","r");
	char word[MAX]="";
	char mean[MAX]="";
	int flag=0; 		//标志位,用来区别记录单词(0)还是意思(1)
	int a; 				//接受fgetc的返回值,必须用int才能取到EFO,直接用char接收会产生段错误。
	char ch;   			//记录单个字符

	while((a=fgetc(fp))!=EOF)
	{
		ch=a;
		if(ch=='\n')
		{
			//写入数据库操作
			char sql[128]="";
			if(snprintf(sql,sizeof(sql),"insert into stu values (\"%s\",\"%s\");",\
								word,mean) < 0)
			{
				fprintf(stderr,"snprintf error:__%d__\n",__LINE__);
				return -1;
			}

			char * errmsg=NULL;
			if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
			{
				fprintf(stderr,"sqlite3_exec:%s __%d__\n",errmsg,__LINE__);
				return -1;
			}
			bzero(word,sizeof(word)); 	//给字符串清零
			bzero(mean,sizeof(mean));
			flag=0;
			continue;
		}else
		{
			if(ch==' ') 		//此文件中,当一行中有一个空格时,就开始收集mean字符串
			{
				flag=1;
			}
			else if(flag==0)
			{
				int len=strlen(word);
				word[len]=ch; 			//把字符加入字符串中
				word[len+1]='\0'; 		//字符串以'\0'结尾
			}else
			{
				int len=strlen(mean);
				mean[len]=ch; 			//把字符加入字符串中
				word[len+1]='\0'; 		//字符串以'\0'结尾
			}
		}
	}

	return 0;

}

运行结果:

c 复制代码
linux@linux:~/study/NETbc$ gcc 03_dictsqlite3.c -lsqlite3
linux@linux:~/study/NETbc$ ./a.out 
create table stu success
sqlite3_close success
linux@linux:~/study/NETbc$ sqlitebrowser dict.db
相关推荐
Shadow(⊙o⊙)23 分钟前
MySQL复合查询
数据库·mysql
励志不掉头发的内向程序员1 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
L·S·P6 小时前
25MB 管理 100+ 种数据库:开源轻量客户端 DBX 介绍与上手
数据库·mysql·开源·database·dbx
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
笃行3508 小时前
KingbaseES KSQL Developer 的连接管理、数据处理与对象管理
数据库
ha_lydms8 小时前
MaxCompute中加密与解密函数
大数据·数据库·数据仓库·hadoop·dataworks·maxcompute·odps
Shadow(⊙o⊙)8 小时前
MySQL内置函数
数据库·mysql
鬓戈9 小时前
Rust 语言与 AI 应用生态调研及学习路径
人工智能·学习·rust
传奇开心果编程9 小时前
【SwiftUI娓娓道来】第3课:让界面活起来——交互与动画指南
学习·macos·ui·ios·swiftui·swift
笃行3509 小时前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库