Linux下IO账号登陆界面
/*
*名 称:Linux下IO账号登陆界面
*功 能:1.注册 2.登陆 3.退出 4.注销 5.修改密码
*作 者:杨某
*时 间:2019.8.10
*
*/
简介:账号登陆为日常所见界面操作,如何利用Linux开发一项属于自己的登陆界面呢?
该项目适合刚学完基本IO操作的童鞋,话不多说,直接上干货!!
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool reg(FILE *fp,char *name,char *passwd) //注册
{
char buf[100]={0};
fseek(fp,0,SEEK_SET);
char n_name[20]={0};
char n_passwd[20]={0};
while(!feof(fp))
{
bzero(buf,sizeof(buf));
bzero(n_name,sizeof(n_name));
bzero(n_passwd,sizeof(n_passwd));
fgets(buf,100,fp);
sscanf(buf,"%s %s",n_name,n_passwd);
if( strcmp(name,n_name) == 0)
{
return false;
}
}
return true;
}
bool login(FILE *fp,char *name,char *passwd) //登陆界面
{
char buf[100]={0};
fseek(fp,0,SEEK_SET);
char n_name[20]={0};
char n_passwd[20]={0};
while(!feof(fp))
{
bzero(buf,sizeof(buf));
bzero(n_name,sizeof(n_name));
bzero(n_passwd,sizeof(n_passwd));
fgets(buf,100,fp);
sscanf(buf,"%s %s",n_name,n_passwd);
if( strcmp(name,n_name) == 0 && strcmp(passwd,n_passwd) == 0)
{
return true;
}
}
return false;
}
void chang(FILE *fp,char *name) //修改密码函数
{
//开始寻找 name 所在的位置
fseek(fp,0,SEEK_SET);
while(!feof(fp))
{
//获取一行数据
char buf[1024]={0};
fgets(buf,1024, fp); //遇到换行符结束或者1024-1个字符结束!难点
printf("%ld\n",strlen(buf));
//判断账号
char code[100]={0};
char pwd[100]={0};
sscanf(buf,"%s %s",code,pwd);
int len = strlen(pwd);
printf("len:%d\n",len );
//判断账号是否一样
if(strcmp(code,name) == 0) //可修改
{
printf("用户存在!\n");
fseek(fp,-len-1,SEEK_CUR);
printf("请重新输入密码:\n");
char passwd1[20]={0};
bzero(passwd1,20);
scanf("%s",passwd1);
fputs(passwd1,fp);
//fprintf(fp, "%s\n",passwd1 ); //这个也可以
fflush(fp);
printf("写入成功!\n");
break;
}
}
}
void del(FILE *fp,char *name) //注销函数
{
//开始寻找 name 所在的位置
fseek(fp,0,SEEK_SET);
while(!feof(fp))
{
//获取一行数据
char buf[1024]={0};
fgets(buf,1024, fp);
printf("%ld\n",strlen(buf));
int len = strlen(buf);
//判断账号
char code[100]={0};
char pwd[100]={0};
sscanf(buf,"%s %s ",code,pwd);
//判断账号是否一样
if(strcmp(code,name) == 0) //注销掉
{
//从当前位置开始偏移
fseek(fp,-(len),SEEK_CUR);
int i = 0;
for ( i = 0; i< len-1;i++)
{
fputc('*',fp);
}
fputc('\n',fp);
bzero(buf,1024);
fflush(fp);
printf("------%s\n",buf);
break;
}
}
}
// r : 以只读的方式打开文件
// r+ : 以读写方式打开文件
// w : 以只写方式打开,并清空文件和创建文件
// w+ : 以读写方式打开,假设文件不存在则创建,文件存在则清空
// a : 以追加 只写 的方式打开文件,假设文件不存在则创建
// a+ : 以追加 读写 的方式打开文件,假设文件不存在则创建
int main()
{
FILE *fp = fopen("data","r+"); //r+是重点,在修改和注销时指针出错的罪魁祸首 必须自己创建文本 data!!
if( fp == NULL )
{
perror("文件打开失败:");
return -1;
}
int n;
int flag = 0;
char name[100]={0};
char passwd[100]={0};
while(1)
{
printf("请输入你想要进行的操作:\n1、注册\t 2、登录 3、退出 4.注销 5.修改\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
printf("用户名:");
scanf("%s",name);
printf("密码:");
scanf("%s",passwd);
if( reg(fp,name,passwd) )
{
fprintf(fp,"%s %s\n",name,passwd);
fflush(fp);
printf("注册成功\n");
}
else
{
printf("注册失败,用户已被注册\n");
}
break;
}
case 2:
{
printf("用户名:");
scanf("%s",name);
printf("密码:");
scanf("%s",passwd);
if( login(fp,name,passwd) )
{
printf("登录成功\n");
}
else
{
printf("登录失败,用户名或密码输入错误\n");
}
break;
}
case 3:
{
flag=1;
break;
}
case 4:
{
printf("用户名:");
scanf("%s",name);
del(fp,name);
break;
}
case 5:
{
printf("用户名:\n");
scanf("%s",name);
chang(fp,name);
break;
}
}
if(flag) break;
}
return 0;