目录
一、运行效果和代码
1.前言
别人的代码项目写的再好,你不理解不会使用,那就终究不是你的,还不如好好看点简单的代码,理解了知识就是自己的,再根据不同的场景去使用,这样子效果更佳。
主要实现效果:
2.介绍
这里是使用结构体跟文件来实现一个简易版的登录注册(没有做判断等等操作,你们可以理解后,自行添加,这样子对于你们的好处也是可想而知,在(链表、结构体)和文件IO这方面代码上遇到问题可以私信我,我会尽我所能帮你解决)。
完整代码如下:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define SIZE 20
FILE *fd;
//定义一个字符数组结构体
typedef struct user
{
char accounts[SIZE];
char password[SIZE];
}node; //这里struct user相当于给结构体起别名叫 node
void user_login(void);
int main(void)
{
//用户提示信息
printf("===================功能===================\n");
printf("a:登录\n");
printf("b:注册\n");
printf("c:退出\n");
printf("===================功能===================\n");
//定义局部变量
node read_buf;
node write_buf;
char data;
int ret=0;
while (1)
{
//用户选择
printf("请选择:");
scanf("%c",&data);
switch (data)
{
case 'a':
//调用登录函数
user_login();
break;
case 'b':
//打开user.txt文件
fd = fopen("user.txt", "r+");
//如果打开失败则提示
if(fd == NULL)
{
printf("文件打开失败!\n");
}
//将光标移到文件尾部,利于写入数据,不把之前的数据给覆盖了
fseek(fd,0,SEEK_END);
//用户输入相应数据
printf("请输入用户账户名:");
scanf("%s",write_buf.accounts);
printf("请输入用户密码:");
scanf("%s",write_buf.password);
//把用户输入的注册信息写入文件user.txt
ret=fwrite(write_buf.accounts,sizeof(write_buf.accounts),1,fd); //账户
if(ret==0)
{
printf("账号写入失败\n");
}
ret=fwrite(write_buf.password,sizeof(write_buf.password),1,fd); //密码
if(ret==0)
{
printf("密码写入失败\n");
}
//最后要记得关闭文件,养成习惯
fclose(fd);
break;
case 'c':
printf("退出程序成功!\n");
return 0;
default:
printf("输入格式错误,请重新输入!\n");
break;
}
while (getchar()!='\n');
}
return 0;
}
//用户登录
void user_login(void)
{
//定义需要用的局部变量
int ret=0;
char user_accounts[20]={0};
char user_password[20]={0};
node read_buf;
//用户输入登录信息
printf("请输入用户账户名:");
scanf("%s",&user_accounts);
printf("请输入用户密码:");
scanf("%s",&user_password);
//打开文件user.txt
fd = fopen("user.txt","a+");
if(fd == NULL)
{
printf("文件打开失败!\n");
}
//将光标移到到开头,利于读取文件数据
fseek(fd,0,SEEK_SET);
while (1)
{
//从文件读取到账号
ret=fread(read_buf.accounts,sizeof(read_buf.accounts),1,fd);
if(ret==0)
{
printf("账户或密码错误,请重新登录!\n");
break;
}
//从文件读取到密码
ret=fread(read_buf.password,sizeof(read_buf.password),1,fd);
if(ret==0)
{
break;
}
//判断如果用户输入的账号和密码和文件读取的一样就告诉用户登录成功
if (strcmp(user_accounts,read_buf.accounts)==0 && strcmp(user_password,read_buf.password)==0)
{
printf("登录成功\n");
break;
}
}
//老样子,记得打开一个文件用完之后一定要关闭
fclose(fd);
}
二、标准IO部分功能介绍
1.文件的打开与关闭
不管用系统IO函数还是标准IO函数,操作文件的第一步,都是“打开(open/fopen)”文件,需要注意:
- 系统IO:打开文件得到的是一个整数,称为文件描述符。
- 标准IO:打开文件得到的是一个指针,称为文件指针。
标准IO打开文件:
标准IO关闭文件:
2 .按数据块读写文件
注意:
- 以上两个函数既能处理文本,也能处理二进制文件。
- 返回值均是成功读写的“块”数,而非字节数
在成功返回值时,写与读字节数:size*nmemb