【更新】[小项目]c语言实现数据库操作(低仿)

说明

上一篇文章里面([小项目]c语言实现数据库操作(低仿))的程序出现了"一些"问题,下面是对上一篇文章的程序修改。大家可以两个程序对照着看。
更新日志:

  1. 通过清空缓冲区解决了表名写不进文件的问题
  2. 通过加前缀解决了库名可表名的命名冲突(正常情况下可以重名)
  3. 修复了库删除后库里的表没有删除的bug
  4. 修复了表菜单功能紊乱的bug
  5. 修复了表名在库里但是无法识别的bug
  6. 修复了不用建库就可以打开一个库的bug
  7. 修复了无法写入数据的bug
  8. 修复了delete时程序进入死循环的bug
  9. 删除了部分多余代码
  10. 新增了一些注释

仍未解决并且不准备解决的bug:

  1. 不同库下的表命名冲突
  2. 在一次程序运行中,被选择过的库删除会出错,重新运行程序可以删除

借口:

  1. 应该可以通过mkdir函数来实现文件夹从而避免命名冲突
  2. 这边建议用户退出程序再运行就可以删除了,(提示permission denied)原因目前我找不出来。

小结:
大部分问题结症是缓冲区和文件指针,需要注意一点的是,当文件打开的时候不可以删除或者改名(记得关闭文件)。

全部代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE*fp;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
#include<ctype.h>
#define MAXLEN 10//账号密码最大长度
#define MAXTIME 3//登陆最大错误次数

FILE * fp;//数据库文件指针
FILE * fp2;//表文件指针
FILE * fp3;//修改时用的容器

struct datas{
   //退一步海阔天空
    char one[20];
    char two[20];
    char three[20];
    char four[20];
};


int login();
int database_func();

int create_database();
int delete_database();
int use_database();

int table_func();

int create_table();
int delete_table();
int select_data();
int add_data();
int delete_data();
int update_data();


int main(){
   
    int i=0;
    while(i<MAXTIME){
   
        if(login()){
   //账号密码正确的时候
            while(database_func());//记得加分号,否则他会以为while的循环体是break;实际上循环体是空语句;
            break;
        }//否则继续循环
        i++;//记得加,否则无限循环
    }
    if(i==MAXTIME){
   
        system("cls");
        printf("已达到输入次数上限,程序即将自动关闭!");
        Sleep(2000);
        return 0;
    }
    system("cls");
    printf("感谢宁的使用,再见!");
    return 0;
}


//第一层调用

int login(){
   //登录,验证密码,正确返回1,错误返回0
    system("cls");
    int i = 0,flag=0;
    char ch = 0;
    char password[MAXLEN]={
   0},username[MAXLEN]={
   0};
    char true_username[]="123",true_password[]="123";
    printf("欢迎使用数据库管理系统\n");
    printf("=========================\n");
    printf("请您先登录\n");
    printf("=========================\n");
    printf("请输入账号:");
    scanf("%s",username);
    if(!strcmp(username,true_username)){
   //用户名输入正确的时候
        printf("请输入密码:");
        while(i<MAXLEN){
   
            ch = getch();//conio.h,无回显,无缓冲区
            if(ch == '\r'){
     //回车结束输入
                /*对于不同的字符输入函数,回车键产生的字符不同
                用户按下回车键时,getchar() 将读取到\n字符,
                而 getch() 将读取到\r字符*/
                printf("\n");
                break;
            }
            if(ch=='\b'&&i>0){
     //按下删除键
                i--;
                printf("\b \b");
            }
            //else if 和 else 还是有区别的
            else if(isprint(ch)){
     //输入可打印字符,ctype.h
                password[i] = ch;
                printf("*");
                i++;
            }
        }
        if(!strcmp(password,true_password)){
   //密码输入正确
            return 1;
        }
        else{
   //密码输入错误
            printf("密码输入错误!(不妨告诉你密码是123)\n");
            printf("宁有以下两个选择:\n");
            printf("=================\n");
            printf(" 1.再次尝试登陆\n 2.退出程序\n");
            printf("=================\n");
            printf("请输入宁的选择:");
            scanf("%d",&flag);
            if(flag==1){
   
                return 0;
            }
            else{
   
                exit(0);//stdlib.h
            }
        }
    }
    else{
   //用户名不对的时候
        printf("用户不存在!(偷偷告诉你,用户名只有123)\n");
        printf("宁有以下两个选择\n");
        printf("=================\n");
        printf(" 1.再次尝试登陆\n 2.退出程序\n");
        printf("=================\n");
        printf("请输入宁的选择:");
        scanf("%d",&flag);
        if(flag==1){
   
            return 0;
        }
        else{
   
            exit(0);//stdlib.h
        }
    }
}


int database_func(){
   //数据库操作菜单
    system("cls");
    //system("color 26");
    int flag=0,func=0;
    printf("功能界面\n");
    printf("============\n");
    printf(" 1.创建数据库\n 2.删除数据库\n 3.选择数据库\n 4.退出程序\n");
    printf("============\n");
    printf("请输入需要使用的功能:");
    scanf("%d",&func);
    switch(func){
   
        case 1:while(create_database());break;//创建数据库
        case 2:while(delete_database());break;//删除数据库
        case 3:while(use_database());break;//打开数据库
        case 4:exit(0);break;
    }
    system("cls");//使用功能后,判断是否继续使用
    printf("你有以下两个选择\n");
    printf("=================\n");
    printf(" 1.继续使用\n 2.退出程序\n");
    printf("=================\n");
    printf("请输入你的选择:");
    scanf("%d",&flag);
    if(flag==1){
   //继续使用
        return 1;
    }
    if(flag==2){
   //退出
        return 0;
    }
    return 0;
}


//第二层调用,父函数为database_func

int create_database(){
   //创建数据库
    system("cls");
    int flag=0;
    char db_name[10],db_url[18];
    printf("新建数据库\n");
    printf("=================\n");
    printf("请输入新库的名字(len<10):");
    scanf("%s",db_name);
    strcpy(db_url,"db_");
    strcat(db_url,db_name);
    strcat(db_url,".txt");
    if((fp=fopen(db_url,"r"))==NULL){
   //判断是否重复建库
        fp=fopen(db_url,"w");
        fclose(fp);//记得!
        printf("创建成功!\n");
        Sleep(1000);
        return 0;//跳出循环
    }
    else{
   
        system("cls");
        printf("该库已经被创建,或命名错误\n");
        printf("你有以下两个选择\n");
        printf("=================\n");
        printf(" 1.重新创建\n 2.取消创建数据库\n 3.退出程序\n")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值