数据库系统
用C语言的链表知识做了一个简单的数据库,原理简单,可以直接复制代码使用,请大佬指导
#include"consts.h"
#include<sys\stat.h>
#include<io.h>
int length = 1;
int fangwen = 0;
int visit[110] = {
0 }; //定义标记数组用于locate与cotinue命令
int continue1 = 0;
int go; //存储当前所指向的记录
char link1[110];
char value1[110];
char zd1[110];
char lxl[110];
typedef struct dbms_node {
//定义数据库类型
char data[110];
char type[110];
struct dbms_node* next;
}DbmsLinklist;
struct dbms_point {
char data[20];
};
struct dbms_point wj[200][10]; //定义结构里型的二维数组以便用来与文件交互
char men[110]; //分别存储文件的每一行,再赋值给wj数组
char ch; //分别接受文件的每一个字符
int len = 0; //wj数组的行数,也就是数据库中记录的数目
int lie = 0;
int com = 0; //记录列数
int i, j, bianlen, fanlen = 0;
char member[110];
char bian[100]; //自动生成的编号转换为相对应的字符串
char fabian[100]; //反向存储bian数组
FILE* fp;
void Switch(char bian[], int num) {
int l = 0;
int n = num;
while (1) {
//把数字转换成对应的字符串并存放到bian数组中
if (n == 0)break;
n = num % 10;
bian[l] = n + 48;
l++;
n = n / 10;
}
}
void HelpDbms() {
printf(" *DBMS命令一览表*\n");
printf("**,use name 使用name数据库 /use 关闭数据库 quit退出系统*\n");
printf("*1,创建数据库命令语法格式 --creat databasename*\n");
printf("*2,追加字段的命令 --append*\n");
printf("*3,浏览数据库中所有的字段命令 --brows*\n");
printf("*4,go命令语法格式 --go number (eg:go 1) 用dips浏览定位的字段 *\n");
printf("*5,条件定位命令语法格式 --locate for 字段名=\"字段内容\"*\n");
printf("*6,按条件删除命令语法格式 --delete for 字段名=\"字段内容\"*\n");
printf("*7,全部删除命令 --zap*\n");
printf("*8,按条件修改命令 --change for 字段名=\"字段内容\"*\n");
printf("*9,按条件排序命令 --升序:sort on 字段名[/a] 降序:sort on 字段名/d *\n");
printf("*10,打开帮助文档命令 --help *\n");
}
void CreateDbmsStruct(DbmsLinklist* database[], int* length) {
//建立数据库类型
char ch[110], type[110], tou[] = "编号 \0"; //建立数据库结构时自动建立编号字段
int len, i;
database[0] = (DbmsLinklist*)malloc(sizeof(DbmsLinklist));
strcpy(database[0]->data, tou); //建立编号字段
strcpy(database[0]->type, "char"); //建立库结构
printf(".请输入字段 %d的名称 以'$'结束输入\n", *length);
printf(".");
scanf("%s", ch);
printf(".请输入字段 %d的类型(string,int,double) \n", *length);
scanf("%s", type);
loop:
while (1) {
if (strcmp(type, "string") == 0 || strcmp(type, "double") == 0 || strcmp(type, "int") == 0) {
break;
}
else {
printf("您输入的类型非法,请重新输入\n");
printf(".请输入字段 %d 的类型(string,double,int) \n", *length);
scanf("%s", type);
}
}
while (1) {
//循环输入入库结构类型,以'$'结束
if (strcmp(ch, "$") == 0)break;
len = strlen(ch);
ch[len] = ' ';
ch[len + 1] = '\0';
database[*length] = (DbmsLinklist*)malloc(sizeof(DbmsLinklist));
strcpy(database[*length]->data, ch);
strcpy(database[*length]->type, type);
*length = *length + 1;
printf(".请输入字段 %d的名称 以'$'结束输入\n", *length);
printf(".");
scanf("%s", ch);
if (strcmp(ch, "$") == 0)break;
printf(".请输入字段 %d 的类型(string,double,int) \n",* length);
scanf("%s", type);
goto loop; //继续输入那么返回loop
}
for (i = 0; i < *length; i++) {
printf("%s (%s) ", database[i]->data, database[i]->type); //输入结束时驶入数据库字段和类型
}
}
void OpenDbms(char app[], int* com, int* len, char bian[], char fabian[]) {
//打开数据库文件并且将文件中的数据存入结构体二维数组中
FILE* fp;
char ch;
char mem[110];
int lie = 0;
memset(bian, '\0', sizeof(bian)); //开始字符型数组初始化
memset(mem, '\0', sizeof(mem));
memset(fabian, '\0', sizeof(fabian));
fp = fopen(app, "r+"); //打开相应的数据文件
ch = fgetc(fp); //获得文件中的每一个字符直到文件末尾
while (ch != EOF) {
//把获得数据按行存入到wj数组里面
if (ch == ' ') {
//如果遇到空格就把mem复制到wj的一个单元中
strcpy(wj[*len][*com].data, mem);
*com = *com + 1;
memset(mem, '\0', sizeof(mem)); //把mem复制到wj的一行中初始化数组mem
lie = 0;
}
else if (ch == '\n') {
//如果遇到回车符则结束wj的一行,开始存储下一行
*len = *len + 1;
*com = 0; //列恢复0
}
else {
mem[lie] = ch; //把在数据库文件中读出的一行存放在mem数组中
lie++;
}
ch = fgetc(fp); //获得文件的下一个字符
}
*len = *len + 1; //每存完一行行数自加
}
void AppendDbms(char bian[], int fanlen, char fabian[], int bianlen, int* com, int* len) {
//追加记录
int i, j, k=1, sum = 0;
memset(bian,'\0', sizeof(bian));
if (*len > 1) {
//自动生成编号的值
j = strlen(wj[*len - 1][0].data);
for (i = j - 1; i >= 0; i--) {
//将数据库最后一条记录的编号值转换成整型
sum = sum + (wj[*len - 1][0].data[i] - '0') * k;
k *= 10;
}
sum++; //追加记录的编号为其最后一条记录的编号加一
Switch(bian, sum);
}
else Switch(bian, 1); //将其编号的值转换成对应字符串
fanlen = 0;
memset(fabian, '\0', sizeof(fabian