本文主要介绍如何用文件来实现系统的注册与登录,其中包含密码的隐藏,如有需要可以参考我的上一篇博客----c语言课程设计 花店管理系统-CSDN博客
1.注册
//注册
void registered()
{
user newuser;
printf("请输入新的用户名:");
scanf("%s", newuser.user_id);
printf("请输入新的密码:");
scanf("%s", newuser.password);
FILE* file = fopen("user_data.dat", "ab");
if (file == NULL)
{
printf("无法打开文件!\n");
return;
}
fwrite(&newuser, sizeof(user), 1, file);
fclose(file);
printf("注册成功!\n");
}
2.隐藏密码
char* hidepassword()//隐藏密码
{
char password[18];//密码
char* p;//指向密码的指针
int i = 0;//记录密码位数
char t;//输入密码
for (;;)//此处为密码不回显操作
{
t = _getch();//输入k
if (t == '\r') break;//如果k为回车,则跳出循环
else if (t == '\b')//如果k为删除键
{
if (i > 0)//如若密码还未完全删除
{
printf("\b");
printf(" ");
printf("\b");
i--;
}
}
else//如果输入的k既不是删除键也不是回车键
{
password[i] = t;//把k的值赋给_password[i]
printf("*");//输出*号,保护用户隐私
i++;//密码位数加1
}
}
password[i] = '\0';//在数组末端加一个结束符
p = password;//让p指向该数组
return p;//返回一个指向密码的指针
}
3.登录
//登录
int login()
{
char user_id[20];
printf("请输入用户名:");
scanf("%s", user_id);
printf("请输入密码:");
char* p;
char _password[18];
p = hidepassword();//记得调用隐藏密码的函数
strcpy(_password, p);
FILE* file = fopen("user_data.dat", "rb");
if (file == NULL)
{
printf("无法打开文件!\n");
return 0;
}
user user;
while (fread(&user, sizeof(user), 1, file))
{
if (strcmp(user_id, user.user_id) == 0 && strcmp(_password, user.password) == 0)
{
printf("\n登陆成功!\n");
return 1;//返回1表示登陆成功
}
}
fclose(file);
printf("\n登录失败!\n");
return login();
}
4.声明
typedef struct
{
char user_id[20];//账号
char password[20];//密码
}user;
void registered();//注册
char* hidepassword();//隐藏密码
int login();//登录
结合我的上一篇博客可以知道我将声明以及结构体的定义都放到了我的头文件里,如果只想用.c文件的话,就要把声明和定义放在前面哦!
5.整合
整个过程可以单独执行, 也可以加入到系统中,以我的花店管理系统为例,怎么才能在登录成功后才显示菜单然后进行下一步操作呢,这就需要我们把以上函数的定义放在main()函数的合适位置,代码如下
int main()
{
//创建头结点
Node* head = malloc(sizeof(Node));
head->next = NULL;
loadorder(head);
while (1)
{
printf("****** 1---注册 ******\n");
printf("****** 2---登录 ******\n");
int choice;
printf("请选择操作类型:");
scanf("%d", &choice);
switch (choice)
{
case 1:
registered();//调用了两个函数是为了避免在注册成功后未登录直接显示菜单
login();
break;
case 2:
login();
break;
default:
printf("无效的选项,请重新选择!\n");
break;
}
while (1)
{
welcome();
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1://录入信息
inputorder(head);
break;
case 2://打印订单
printorder(head);
break;
case 3://统计订单
countorder(head);
break;
case 4://查询订单
findorder(head);
break;
case 5://修改订单
modifyorder(head);
break;
case 6://删除订单
deleteorder(head);
break;
case 7://订单排序
sortorder(head);
break;
case 0://退出系统
printf("Bye Bye!\n");
return;
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
}
和以前的进行比较我们会发现,我重新用了一个while()循环来控制注册和登录,为了在只有在登陆成功后才显示菜单,我将原来的while()循环嵌套在switch()循环结束后的位置,这样就能实现我们的要求啦!
执行效果图
好了到这里我们的整个花店管理系统算是完整完成了,如若有问题欢迎大家在评论区交流哦!