【IO进程线程】使用标准IO函数完成用户的登录和注册

news2024/9/23 5:32:27

 1 实现登录功能

自定义一个usr.txt,先手动输入其账户密码。

格式:账户 密码

例:

zhangsan 12345

lisi abcde

wangwu abc123

需求如下:

1. 从终端获取账户密码,与文件中的账户密码比较;

2. 若终端输入的账户不存在,则输出账户不存在;

3. 若终端输入的账户存在,但是密码不正确,则输出密码错误;

4. 若账户密码均正确,则输出登录成功。

方法一

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	char get_usrname[20]="";
	char get_usrpass[20]="";
	printf("请输入账号:");
	scanf("%s",get_usrname);
	printf("请输入密码:");
	scanf("%s",get_usrpass);

	FILE* fp=fopen("./usr.txt","r");
	if(NULL == fopen)
	{
		perror("fopen");
		return -1;
	}

	char file_name[20];
	char file_pass[20];
	int flag=0;
	while(1)
	{
		if(fscanf(fp,"%s %s",file_name,file_pass)==EOF)//从终端读取账号密码
		{
			flag=1;
			break;
		}
		if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)!=0)
		{
			printf("密码错误!\n");
			break;
		}
		if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)==0)
		{
			printf("登录成功!\n");
			break;
		}
	}
	if(flag==1)
	{
		printf("该用户不存在!\n");
	}
	fclose(fp);
return 0;
}

方法二

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, const char *argv[])                                                   
{
    char get_name[20] = "", get_passwd[20] = "";
    char file_name[20] = "", file_passwd[20] = "";


    //从终端获取账户密码
    printf("请输入账户和密码>>> ");
    scanf("%s %s", get_name, get_passwd);

    //以读的方式打开文件
    FILE* fp = fopen("./usr.txt", "r");
    if(NULL == fp)
    {
        perror("fopen");
        return -1;
    }

    //循环读取文件的一行:账户  密码
    while(1)
    {
        //将字符串清空
        bzero(file_name, sizeof(file_name));
        bzero(file_passwd, sizeof(file_passwd));

        if(fscanf(fp, "%s %s", file_name, file_passwd) == EOF)
        {
            printf("%s 用户不存在\n", get_name);
            break;
        }
    //  printf("%s %s\n", file_name, file_passwd);

        //与终端获取到的账户密码比较
        if(strcmp(file_name, get_name) != 0)    //若账户名不相同,则去获取下一个账户密码
            continue;

        if(strcmp(file_passwd, get_passwd) != 0)
        {
            printf("%s 密码错误\n", get_name);
        }
        else
        {
            printf("%s 用户登录成功\n", get_name);
        }

        break;      //若账户相同,则不需要继续往后比较其他用户了
    }

    //关闭文件
    fclose(fp);

    return 0;
}

2 实现注册功能

注册的账户密码存储在上一题的文件中。

需求:不能重复注册。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int log_on();
int regist();
int main(int argc, const char *argv[])
{
	/*
	   一、实现登录功能。自定义一个usr.txt,手动输入账户密码,格式如下:账户 密码
	   例如:  zhangsan  12345
	   lisi  abcde
	   wangwu abc123
	   需求如下:
	   1.从终端获取账户密码,与文件中的账户密码比较
	   2.若终端输入的账户不存在,则输出账户不存在
	   3.若终端输入的账户存在,但是密码不正确,则输出密码错误
	   4.若账户密码均正确,则输出登录成功
	   二、附加题
	   实现注册功能,注册的账户密码存储在上一题的文件中。需求:不能重复注册。
	   */
	int choose;
	printf("请选择是注册用户(1)还是登录用户(2):");
	scanf("%d",&choose);
	if(choose!=1&&choose!=2)
	{
		printf("选择失败!\n");
		return 0;
	}
	//注册
	else if(choose==1)
	{
		regist();
	}
	//登录
	else
	{
		log_on();
	}
	return 0;
}
int log_on()
{
	char get_usrname[20]="";
	char get_usrpass[20]="";
	printf("请输入账号:");
	scanf("%s",get_usrname);
	printf("请输入密码:");
	scanf("%s",get_usrpass);

	FILE* fp=fopen("./usr.txt","r");
	if(NULL == fopen)
	{
		perror("fopen");
		return -1;
	}

	char file_name[20];
	char file_pass[20];
	int flag=0;
	while(1)
	{
		if(fscanf(fp,"%s %s",file_name,file_pass)==EOF)//从终端读取账号密码
		{
			flag=1;
			break;
		}
		if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)!=0)
		{
			printf("密码错误!\n");
			int b=0;
			printf("请问是否要再次登录(0/1):");
			scanf("%d",&b);
			if(b==1)
			{
				log_on();
			}
			break;
		}
		if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)==0)
		{
			printf("登录成功!\n");
			break;
		}
	}
	if(flag==1)
	{
		printf("该用户不存在!\n");
		int b=0;
		printf("请选择是否要注册(0/1):");
		scanf("%d",&b);
		if(b==1)
		{
			regist();
		}
	}
	fclose(fp);
	return 0;
}

int regist()
{
	char get_usrname[20];
	char get_usrpass[20];
	printf("请输入注册账户:");
	scanf("%s",get_usrname);
	printf("请输入注册密码:");
	scanf("%s",get_usrpass);
	FILE* fp=fopen("./usr.txt","r");
	char file_name[20];
	char file_pass[20];
	int flag=0;
	while(1)
	{
		if(fscanf(fp,"%s %s",file_name,file_pass)==EOF)
		{
			flag=1;
			break;
		}
		if(strcmp(get_usrname,file_name)==0)
		{
			printf("用户已存在!\n");
			int b=0;
			printf("请问是否直接选择登录(0/1):");
			scanf("%d",&b);
			if(b==1)
			{
				log_on();
			}
			break;
		}
	}
	if(flag==1)
	{
		fclose(fp);
		fp=fopen("./usr.txt","a+");
		fprintf(fp,"%s %s",get_usrname,get_usrpass);
		fputc(10,fp);
		printf("注册成功!\n");
	}
	fclose(fp);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

胖小酱之麻雀虽小

麻雀虽小&#xff0c;五脏俱全的意思&#xff1a;比喻事物的体积或规模虽小&#xff0c;具备的内容却很齐全。释义&#xff1a;比喻事物体积或规模虽小&#xff0c;具备的内容却很齐全。出处&#xff1a;茹志娟《如愿》&#xff1a;你别看我们那个生产小组不大&#xff0c;麻雀…

web自动化框架:selenium学习使用操作大全(Python版)

目录 一、浏览器驱动下载二、selenium-python安装&#xff08;打开网站、操作元素&#xff09;三、网页解析&#xff08;HTML、xpath&#xff09;四、selenium基本操作1、元素定位八种方法2、元素动态定位3、iframe切换4、填充表单_填充文本框5、填充表单_单选按钮6、填充表单_…

XGBoost,LightGBM

目录 XGBoost LightGBM Boosting 框架的主流集成算法&#xff0c;包括 XGBoost 和 LightGBM。 送上完整的思维导图&#xff1a; XGBoost XGBoost 是大规模并行 boosting tree 的工具&#xff0c;它是目前最快最好的开源 boosting tree 工具包&#xff0c;比常见的工具包快 1…

如何将多个网页合并成一个PDF文件?

pdfFactory是一款PDF虚拟打印软件&#xff0c;但与其他虚拟打印机软件不同的是&#xff0c;它使用起来更加简单高效。由于无需Acrobat就能生成Adobe PDF文件&#xff0c;它可以帮助用户在系统没有连接打印机的情况下&#xff0c;将大部分支持打印的文档资料迅速转换成PDF文件&a…

代码随想录第29天|491.递增子序列,46.全排列,47.全排列II

491.递增子序列 491. 递增子序列 这道题的特点是有序的子序列(不能对原数组排序)&#xff0c;最终结果集res不能有重复子集。所以这道题又是子集又是去重 回溯三部曲 1.递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&a…

无人机自主飞行实战入门-第一课(简介)

研究的意义&#xff1a;对人类操作的严重依赖&#xff0c;严重阻碍了泛无人机行业的发展。 飞行汽车&#xff08;UAM&#xff09;即将到来&#xff0c;不论是从成本还是安全考虑都需要自主飞行。 传统飞控基于STM32架构设计&#xff0c;无法满足更智能功能所需的计算量&#xf…

机器学习简介[01/2]:简单线性回归

Python 中的机器学习简介&#xff1a;简单线性回归 一、说明 简单线性回归为机器学习提供了优雅的介绍。它可用于标识自变量和因变量之间的关系。使用梯度下降&#xff0c;可以训练基本模型以拟合一组点以供未来预测。 二、技术背景 这是涵盖回归、梯度下降、分类和机器学习的其…

QT概括-Rainy

Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&#xff09;&#xff0c;还包含很多其它功能&#xff0c;比如多线程、访问数据库、图像处理、音频…

为Android做一个ShowModal窗口

大家知道&#xff0c;用Delphi实现一个Form&#xff0c;并用ShowModal显示出来&#xff0c;在Android平台是非阻塞的&#xff0c;即执行了Form.ShowModal&#xff0c;代码会继续往下执行而不是等待&#xff0c;这跟在Windows平台是完全不一样的。如果我们需要类似阻塞的效果&am…

使用eclipse编写Java代码:将缩进用空格,而不用Tab

在菜单中选择Window->Preferences&#xff1a; 选择Java下面的Formatter&#xff1a; 点击Edit按钮&#xff0c;在弹出窗口中&#xff0c;Tab policy选择Spaces only&#xff1a; 将Profile name改为一个其它的名字才能保存&#xff1a; 以后新创建的函数、类缩进就…

[ VMware 虚拟机 ] 启动不了图形界面,报 “The system is running in low-graphics mode” 错误

文章目录 问题现象异常原因解决方案 问题现象 在启动虚拟机的时候&#xff0c;不能正常的进入图形界面&#xff0c;报 “The system is running in low-graphics mode” 错误。 异常原因 启动界面的xorg.conf文件失败并删除。 解决方案 1、点击异常界面上的 “ok”后&…

智慧工地项目管理平台源码 项目工程云平台源码 劳务管理、数据预警、视频实时监控、重大危险源和绿色文明施工

通过运用物联网、大数据、云计算、BIM 等技术&#xff0c;搭建由劳务管理、质量安全数据预警、施工现场视频实时监控、重大危险源和绿色文明施工监控等板块构成的模块化、一站式的信息化管理平台。平台可实现施工现场数据采集、数据综合统计及分析、手机App 应用等&#xff0c;…

【LeetCode-面试经典150题-day14】

目录 19.删除链表的倒数第N个结点 82.删除排序链表中的重复元素Ⅱ 61. 旋转链表 86.分隔链表 146.LRU缓存 19.删除链表的倒数第N个结点 题意&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 【输入样例】head [1,2,3,4,5…

什么是性能测试?

性能测试的方法 随着计算机技术的飞速发展&#xff0c;软件性能测试在软件工程领域中占据了越来越重要的地位。本文将介绍软件性能测试的基本概念、方法以及常见的技术指标&#xff0c;帮助读者更好地理解和实施软件性能测试。 一、软件性能测试的基本概念 软件性能测试主要用于…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

苍穹外卖总结

前言 1、软件开发流程 瀑布模型需求分析//需求规格说明书、产品原型↓ 设计 //UI设计、数据库设计、接口设计↓编码 //项目代码、单元测试↓ 测试 //测试用例、测试报告↓上线运维 //软件环境安装、配置第一阶段&#xff1a;需求分析需求规格说明书、产品原型一般来说…

机器学习的测试和验证(Machine Learning 研习之五)

关于 Machine Learning 研习之三、四&#xff0c;可到秋码记录上浏览。 测试和验证 了解模型对新案例的推广效果的唯一方法是在新案例上进行实际尝试。 一种方法是将模型投入生产并监控其性能。 这很有效&#xff0c;但如果你的模型非常糟糕&#xff0c;你的用户会抱怨——这…

Config:客户端连接服务器访问远程

springcloud-config: springcloud-config push pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

Jenkins工具系列 —— 插件 实现将单个JOB聚合在一个JOB中

文章目录 安装插件创建聚合JOB 安装插件 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins 创建聚合JOB 1、新建一个名为D的聚合JOB 2、设置聚合JOB下所有单个JOB的参数&#xff0c;配置完对应的参数后&#xff0c;当聚合JOB运行时&#xff…