?? 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 + -