首先要在exe文件目录下新建一个users.txt文件 ,代码亲测可行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct users
{
char id[10]; //账号
char password[6]; //密码
char name[15];//姓名为字符串
char sex; //性别为单个字符
}users;
/*注册账号*/
void registers() //按结构体的大小,一次写入或者读入1个结构体大小
{
users a,b;
FILE *fp;
char password_two[20];
printf("欢迎来到注册界面!\n");
fp = fopen("users.txt","r");
fread(&b, sizeof(struct users), 1, fp); //读入一个结构体字符块 到b
printf("请输入你的账号\n");
scanf("%s",&a.id);
while(1)
{
if (strcmp(a.id, b.id)) /*如果两串不相等*/
{
if(!feof(fp))
{
fread(&b, sizeof(struct users), 1, fp);
}
else
{
break;
}
}
else
{
printf("此用户名已存在!请重新注册!\n");
fclose(fp);
fp=NULL;
return;
}
}
printf("请输入姓名:\n");
scanf("%s",&a.name);
printf("请输入性别(f(女)/m(男)):\n");
scanf(" %s",&a.sex);
do{
if(a.sex != 'f' && a.sex != 'm'){
printf("性别输入错误!请重新输入!\n");
scanf("%c",&a.sex);
}
}while(a.sex != 'f' && a.sex != 'm');
printf("请输入密码\n");
scanf(" %s",&a.password);
printf("请重新输入,确认密码\n");
scanf(" %s",&password_two);
do{
if(!strcmp(a.password,password_two)){
fp = fopen("users.txt","a");
fwrite(&a, sizeof(struct users), 1, fp);
printf("账号注册成功,请登录!\n");
fclose(fp);
return;
}else{
printf("两次密码不匹配!请重新输入!\n");
scanf("%s",&a.password);
printf("请确认密码\n");
scanf("%s",&password_two);
}
}while(1);
}
/*登录系统*/
void Login()
{
users a,b;
FILE *fp;
printf("欢迎来到登录界面!\n");
fp = fopen("users.txt","r");
fread(&b, sizeof(struct users), 1, fp); //读入一个结构体字符块 写入b
printf("请输入账号\n");
scanf("%s",&a.id);
while (1)
{
if (!strcmp(a.id, b.id)) //如果有此用户名
{
break;
}
else
{
if(!feof(fp))
{
fread(&b, sizeof(struct users), 1, fp);
}
else
{
printf("此用户名不存在,请重新输入!\n");
fclose(fp);
return;
}
}
}
printf("请输入密码\n");
do{
scanf("%s",&a.password);
if (strcmp(a.password, b.password)==0) /*如果密码匹配*/
{
fclose(fp);
printf("登录成功,欢迎使用!");
return;
}
else
{ printf("密码不正确!请重新输入密码\n");
}
}while(strcmp(a.password, b.password));
}
/*找回密码*/
void reback()
{
users a,b;
FILE *fp;
char temp[20];
int count = 0;
printf("欢迎来到找回密码界面!\n");
fp = fopen("users.txt","r");
fread(&b, sizeof(struct users), 1, fp);
printf("请输入账号\n");
scanf("%s",&a.id);
while (1)//在文件中找到与用户输入相同的id
{
if (!strcmp(a.id, b.id))
{
break;
}
else
{
if (!feof(fp))//没读到文件尾,继续读
{
fread(&b, sizeof(users), 1, fp);
}
else
{
printf("您输入的账号不存在!请重新输入!\n");
fclose(fp);
return;
}
}
}
printf("请输入您的姓名>>");
scanf("%s", &a.name);
do//匹配姓名
{
if (strcmp(a.name, b.name))
{
printf("输入错误,请重新输入!\n");
scanf("%s", &a.name);
}
} while (strcmp(a.name, b.name));
printf("您的密码是:%s",b.password);
}
void chang_account()
{
users a,b;
FILE *fp;
int t;
char temp[10];
char now_a[10];
char now_b[10];
printf("欢迎进入修改账号界面");
fp = fopen("users.txt","r");
fread(&b, sizeof(struct users), 1, fp); //读入一个结构体字符块 写入b
printf("请输入原有账号");
scanf("%s",&a.id);
do
{
if (!strcmp(a.id, b.id)) //如果有此用户名
{
break;
}
else
{
if(!feof(fp))
{
fread(&b, sizeof(struct users), 1, fp);
}
else
{
printf("此用户名不存在,请重新输入!\n");
return;
}
}
}while(strcmp(a.id, b.id));
printf("请输入密码\n");
scanf("%s",&a.password);
do{
scanf("%s",&a.password);
if (strcmp(a.password, b.password)==0) /*如果密码匹配*/
{
printf("登录成功,欢迎使用!");
break;
}
else
{
printf("密码不正确!请重新输入密码\n");
}
}
while(strcmp(a.password, b.password));
printf("请输入你修改之后的账号");
scanf("%s",&now_a);
if(!strcmp(now_a,a.id))
{
printf("账号与之前相同,请确定是否放弃更改,1.放弃2.继续输入");
scanf("%d",&t);
switch(t)
{
case 1:
printf("保留之前账号成功");
fclose(fp);
break;
case 2:
printf("请输入需要更改后的账号");
scanf("%s",&now_b);
if(!strcmp(now_b,a.id))
{
printf("两次输入相同账号,强制退出");
exit(0);
}
else
{
strcpy(a.id,now_b);
fp = fopen("users.txt","a");
fwrite(&a, sizeof(struct users), 1, fp);
fprintf(fp,"%s",a.id);
printf("账户更改成功");
fclose(fp);
return;
}
default:
break;
}
}
else
{
strcpy(a.id,now_a);
fp = fopen("users.txt","a");
fwrite(&a, sizeof(struct users), 1, fp);
fprintf(fp,"%s",a.id);
printf("账户更改成功");
fclose(fp);
}
}
void menu()
{
printf("欢迎来到账户登录系统,请先选择你需要办理的业务!\n");
printf("***************************************************\n");
printf("1.注册账号\n");
printf("2.登录账号\n");
printf("3.找回密码\n");
printf("4.修改账号\n");
printf("5.退出系统\n");
printf("*****************************************************\n");
}
int main()
{
char input;
do
{
menu();
setbuf(stdin, NULL);//注意清空输入缓存
input = getchar();
switch (input)
{
case '1':
registers();
break;
case '2':
Login();
break;
case '3':
reback();
break;
case '4':
chang_account();
break;
case '5':
printf("退出成功!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}while(input!='5');
}