C语言--使用fopen、fgets、fprintf(标准IO)实现注册、登录、功能--(完整代码-分文件)

目录

功能

使用到的函数:

代码如下

main.c

login.c

login.h


功能

将注册的用户名密码,保存到本地文件中(User.txt)(创建在当前执行目录下了)
对文件的新建,打开,读写,关闭
注册:防止用户名重复
登录:登录成功,显示其他界面
#代码完整注释#

使用到的函数:

文件流指针 FILE * 
fopen("路径文件名","打开方式");	//a+ :读写权限,没有文件就创建,有追加

fgets(数组首地址,数组大小,fp);	
//从文件流指针里读取数组大小个字节的内容,写到数组里
//注意:读取文件时遇到文件结束符EOF 和 换行符'\n'时结束,并在后面添加'\0',
//所以它可以获取一整行的内容

fprintf(fp,"内容");	//把内容写入到文件里

perror("提示信息");	//输出错误信息

fflush(fp);	//手动刷新缓冲区,只有整个程序结束或缓冲区刷新时,缓冲区的内容才会写到文件里
		//全缓冲的缓冲区大小为4k
		
strtok(字符串,"以这个为截取的标志位");
//截取
//注意:第二次截取的时候 不可以用文件名,用NULL 表示第一次截取完剩下的内容

strcmp(字符串1,字符串2);	//字符串比较,如果相等 返回 0

代码如下

main.c

#include "login.h"

int main()
{
    char cho;//用于接收用户输入的选择,也可以用int型,
	//但是int型定义的变量,如果不小心输入了其他字符(字母),会进入死循环
	while(1)
	{
	    Zmenu();//主界面菜单
    	printf("input your 选择>>");
	    scanf("%c",&cho);
	    getchar();//%c获取,需要吃掉垃圾字符
    	switch(cho)
	    {
	    	case '1' :
    	    //注册
        	UserZ_C();
	        break;
    	case '2' :
        	//登录
	        Userlogin();
    	    break;
	    case '0' :
    	    //退出
        	printf("退出了啊\n");
	        return 0;
    	    break;
	    default:
    	    printf("瞎写\n");
        	break;
	    }    
	}	
}

login.c

#include "login.h"

void Zmenu()//主界面菜单
{
    puts("|------------------------------|");
    puts("|-----1.注册--2.登录-----------|");
    puts("|---------0.退出---------------|");
    puts("|------------------------------|");
}

void CGmenu()//登录成功的界面菜单
{
    puts("|------------------------------|");
    puts("|----1.查询单词--2.历史记录----|");
    puts("|------------0.退出------------|");
    puts("|------------------------------|");
}

void UserZ_C()//注册函数
{
    char user[32] = {0};//接收用户名uesrname
    char pawd[32] = {0};//接收密码 password
    char test[128] = {0};//
    printf("请输入用户名:");
    scanf("%s",user);
    printf("请输入密码:");
    scanf("%s",pawd);
    getchar();//吃掉垃圾字符(回车符)

	FILE * fp;//定义一个文件流指针,
    if((fp = fopen("User.txt","a+"))==NULL)//读写权限,文件存在就追加,不存在就新建,
    {
        perror("fopen error");//open返回值 是 NULL的时候,表示出错,打印错误信息
        return ;
    }

    char *ret;
    int flags = 0;

    while(fgets(test,sizeof(test),fp) != NULL)//fgets 函数,遇到'\n'结束==>所以可以一次获取一行
				//把获取的内容存放到test数组里(前面定义的)
    {
        ret = strtok(test,":");// 截取':' 前面的字符内容(也就是用户名)(注意返回值类型)
      
        //printf("ret==user==%s\n",ret);	//输出测试
     
        if(strcmp(ret,user) == 0 )//字符串比较,相等返回0
        {
            printf("用户名< %s >已存在\n",user);
            return;
        }
       
    }

    if(fprintf(fp,"%s:%s\n",user,pawd) == EOF)	//按照格式写入到fp对应的文件里
    {
        perror("fprintf zhuce error");
        return;
    }
	fflush(fp);//刷新缓冲区,否则数据写不进去(全缓冲缓冲区大小 4K)
    printf("注册成功\n");
	fclose(fp);//关闭文件
}



void Userlogin()//登录
{
    char user[32] = {0};
    char pawd[32] = {0};
    char test[128] = {0};
    printf("请输入用户名:");
    scanf("%s",user);
    printf("请输入密码:");
    scanf("%s",pawd);
    getchar();

    FILE * fp;
    if((fp = fopen("User.txt","a+"))==NULL)
    {
        perror("fopen error");
        return ;
    }

    char *ret;
    char *ret2;//定义接收 密码
    int flags = 0;
    while(fgets(test,sizeof(test),fp) != NULL)
    {
        ret = strtok(test,":");
        ret2 = strtok(NULL,"\n");//注意第二次截取,写NULL,表示第一次截取完后 剩下的内容
        //printf("ret==user==%s\n",ret);	//测试
        //printf("ret2 == passwd == %s\n",ret2);
        if((strcmp(ret,user) == 0 )&&(strcmp(ret2,pawd) == 0) )
        {
            printf("---登录成功---\n");
            CGmenu();
            flags = 1;
	    puts("+++++++这是分界线++++++++分界线+++++++++++++++++++");
		
	    exit(0);//整个程序结束吧,毕竟也没别的事干了
        }
       
    }
    if(flags == 0)
    {
        printf("--用户名或密码错误,请重新输入--\n");
        return;
    }
	fclose(fp);
}

login.h

#ifndef _LOGIN_H_
#define _LOGIN_H_

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

void Zmenu();
void UserZ_C();
void Userlogin();
void CGmenu();

#endif

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值