目录
功能
将注册的用户名密码,保存到本地文件中(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