📄 login.cpp
字号:
//login.cpp
//登陆系统
#include "StdAfx.h"
#include "typedef.h"
#include "md5.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
// 名称:login
// 作用:判断用户名和密码是否正确
// 参数:void
// 返回值:登录成功:(bool)true
// 登录失败:(bool)false
bool login(void)
{
if ((fp_user = fopen("user.dat","r")) == 0)
{
printf("The program run appears an accident error, click arbitrarily the key go on.");/*程序运行出现意外错误,按任意键继续*/
getch();
return false;
}
char read_username_md5[40],read_password_md5[40];
unsigned char username_md5[17], password_md5[17];
read_username_md5[0] = '\0';
read_password_md5[0] = '\0';
rewind(fp_user);
fscanf(fp_user,"%s\n%s\n%f\n%c\n%d\n%d",read_username_md5,read_password_md5,&user.price,&user.language,&user.Dimension.p_long,&user.Dimension.p_breadth);
if (user.language == 'c') //初始化界面语言
{
p_language_print = Chinese;
}
else
{
p_language_print = English;
}
//********************************************************* Debug
#ifdef DEBUG
printf("\n\nDebug\n");
printf("The strlen of read username_md5 = %d",strlen(read_username_md5));
printf("\n%s\n",read_username_md5);
printf("\n\n");
getch();
#endif
//**********************************************************
fclose(fp_user);
if ((strlen(read_username_md5)) == 0)
{
Out_hander_ce();
printf("Running system for the first time, click any key establish an user.\n\n第一次运行系统,按任意键创建用户\n\n");
getch();
char password[20];
system("cls");
Out_hander_ce();
while(1)
{
printf("\t\t\t\te.English\n\n\t\t\t\tc.简体中文\n\n\nPlease choose an interface language:\n\n请选择界面语言:\n\n");
scanf("%c",&user.language);
system("cls");
if (user.language == 'c') //初始化界面语言
{
p_language_print = Chinese;
Out_hander_ch();
}
else
{
p_language_print = English;
Out_hander_en();
}
printf("\n\n%s",*(p_language_print));/*请输入用户名:*/
scanf("%s",&user.username);
while (1)
{
printf("\n%s",*(p_language_print+1));/*请输入密码:*/
starword(user.password);
printf("\n\n%s",*(p_language_print+2));/*请重复输入密码:*/
starword(password);
if (strcmp(password,user.password) == 0)
break;
else
printf("\n%s\n",*(p_language_print+3));/*两次密码输入不一致,请重新输入!*/
}
printf("\n\n%s",*(p_language_print+4));/*请设置每小时停车价格(格式:元.角分,例如:15.00):*/
scanf("%f",&user.price);
printf("\n\n%s",*(p_language_print + 77));/*请设置停车场的容量(格式:长.宽,例如:5.4):*/
scanf("%d%*c%d",&user.Dimension.p_long,&user.Dimension.p_breadth);
printf("\n%s%s\n%s",*(p_language_print+5),user.username,*(p_language_print+6));/*您的用户名是:*/ /*密 码 是 :*/
for (unsigned i=0; i<strlen(user.password); i++) //按照密码长度输出星号
printf("*");
printf("\n%s%.2f\n%s%d * %d.\n%s",*(p_language_print+7),user.price,*(p_language_print + 78),user.Dimension.p_long,user.Dimension.p_breadth,*(p_language_print+8));/*每小时停车价格是:*/ /*以上信息正确吗?(y/n)*/
char command = 'y';
fflush(stdin);
command = getchar();
switch(command)
{
case 'y':
{
MD5_CTX md5; //初始化用于MD5的加密结构
MD5Init(&md5);
MD5Update(&md5,username_md5,strlen((char *)user.username)); //对用户名和密码进行MD5加密
MD5Final(username_md5,&md5);
MD5Update(&md5,password_md5,strlen((char *)user.password));
MD5Final(password_md5,&md5);
if ((fp_user = fopen("user.dat","w")) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
fclose(fp_user);
return false;
}
for (int ij=0; ij<17; ij++) //将md5密文写入到文件
{
fprintf(fp_user,"%x",username_md5[ij]);
}
fprintf(fp_user,"\n");
for (ij=0; ij<17; ij++)
{
fprintf(fp_user,"%x",password_md5[ij]);
}
fprintf(fp_user,"\n%f",user.price);
fprintf(fp_user,"\n%c",user.language);
fprintf(fp_user,"\n%d",user.Dimension.p_long);
fprintf(fp_user,"\n%d",user.Dimension.p_breadth);
fclose (fp_user);
carlist = InitList_Sq(sizeof(park_car),user.Dimension.p_long * user.Dimension.p_breadth); //生成停车记录文件
if((InPush(carlist, user.Dimension.p_long, user.Dimension.p_breadth)) == false) //初始化车位
{
return false;
}
if ((fp_car = fopen("parkcar.dat","wb")) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
return false;
}
if (fwrite(carlist,sizeof(park_car),user.Dimension.p_long * user.Dimension.p_breadth,fp_car) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
fclose(fp_car);
return false;
}
fclose(fp_car);
printf("\n\n%s",*(p_language_print+10));/*用户创建成功,现在将以新用户身份登录,按任意键继续。*/
login_log();
getch();
return true;
}
case 'n':
{
fclose (fp_user);
break;
}
}
}
}
char in_username[20],in_password[20];
while(1)
{
if (user.language == 'c')
{
Out_hander_ch();
}
else if (user.language == 'e')
{
Out_hander_en();
}
printf("\t\t%s",*(p_language_print));/*请输入用户名:*/
gets(in_username);
printf("\n\t\t%s",*(p_language_print+1));/*请输入 密码:*/
starword(in_password);
for(int ini = 0; ini<20; ini++)
{
user.username[ini] = in_username[ini];
user.password[ini] = in_password[ini];
}
unsigned char in_username_md5[17], in_password_md5[17];
MD5_CTX md5; //初始化用于MD5的加密结构
MD5Init(&md5);
MD5Update(&md5,in_username_md5,strlen(in_username)); //对得到的用户名和密码进行MD5加密
MD5Final(username_md5,&md5);
MD5Update(&md5,in_password_md5,strlen(in_password));
MD5Final(password_md5,&md5);
if ((fp_user = fopen("temp.tmp","w")) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
return false;
}
for (int ij=0; ij<17; ij++) //将md5密文写入到文件
{
fprintf(fp_user,"%x",username_md5[ij]);
}
fprintf(fp_user,"\n");
for (ij=0; ij<17; ij++)
{
fprintf(fp_user,"%x",password_md5[ij]);
}
fclose (fp_user);
if ((fp_user = fopen("temp.tmp","r")) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
return false;
}
char write_username_md5[40],write_password_md5[40];
rewind(fp_user);
fscanf(fp_user,"%s\n%s",write_username_md5,write_password_md5);
fclose(fp_user);
//********************************************************* Debug
#ifdef DEBUG
printf("\n\nDebug\n");
printf("read_username_md5 = %s\n",read_username_md5);
printf("write_username_md5 = %s\n",write_username_md5);
printf("read_password_md5 = %s\n",read_password_md5);
printf("write_password_md5 = %s\n",write_password_md5);
printf("\n\n");
getch();
#endif
//**********************************************************
if (strcmp(read_username_md5, write_username_md5) == 0 && strcmp(read_password_md5,write_password_md5) == 0) //比较输入帐户的和文件中读取的MD5值是否相等
{
printf("\n\n%s\n",*(p_language_print+11));/*登陆成功,按任意键继续*/
getch();
break;
}
else
{
printf("\n\n%s\n\n",*(p_language_print+12));/*用户名或密码输入错误,请重新输入。按任意键继续*/
getch();
system("cls");
}
}
carlist = InitList_Sq(sizeof(park_car),user.Dimension.p_long * user.Dimension.p_breadth);
if ((fp_car = fopen("parkcar.dat","rb")) == 0) //将车辆数据文件载入内存
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
return false;
}
if(fread(carlist,sizeof(park_car),user.Dimension.p_long * user.Dimension.p_breadth,fp_car) == 0)
{
printf("%s",*(p_language_print+9));/*程序运行出现意外错误,按任意键继续*/
getch();
fclose(fp_car);
return false;
}
fclose(fp_car);
login_log();
system("del temp.tmp");
return true;
}
//回显星号输入密码
// 密码可输入范围:0-9,A-Z,a-z,space
void starword(char password[20])
{
char ch;
int ii=0;
while ((ch = getch()) != 13)
{
if ((ch>=48 && ch<=57) || (ch>=65 && ch<=90) || (ch>=97 && ch<=122) || ch==10)
{
password[ii] = ch;
ii++;
printf("*");
}
else if (ch == '\b' && ii>0)
{
printf("\b");
printf(" ");
printf("\b");
ii--;
}
}
password[ii] = '\0';
for (ii=ii+1; ii<20; ii++)
{
password[ii] = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -