设计要求:
1…系统默认已经设置两种密码(root用户密码:123456,用户密码:345678),两个密码都可以进行解锁。
2.解锁后可进入系统,进入系统后,可以更改用户密码。root密码是不可以更改。更改后的密码保存在文件当中下一次进入系统,则输入的用户密码为上次更改的密码。
大概思路:
1.root不可改,所以定义数组
2.Linux下皆文件,将用户密码写入自定义的密码文件中(psw.txt)
3.使用read读文件,但是有些时候密码文件的光标不一定在末尾,所以使用lseek将光标设置到文件末尾
4.将读到的buff,定义的root密码数组和在shell输入的字符串进行比较(strcmp)
5.将密码文件清空,将输入的字符串写入密码文件中
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define FILE1 "/mnt/hgfs/share/week10/psw.txt" //宏定义文件路径(自己定义)
int main (int argc,char *argv[]){
int file_fd1,len;
char arr1[] = "123456";//root用户密码不可以更改
char in1[10]="";
file_fd1 = open(FILE1, O_RDWR|O_CREAT,0777);//打开密码文件
if(-1 == file_fd1)
{
printf("file_fd1 open failure\n");
return -1;
}
len=lseek(file_fd1,0,SEEK_END);//将文件光标设置在文件末尾,获取源文件大小
char buff[len];
lseek(file_fd1,0,SEEK_SET);//将文件光标设置在文件开头,便读取
read(file_fd1,buff,len);//读文件,主要读出buf
close(file_fd1);
printf("请输入用户登录密码(root用户密码):");
scanf("%s",*argv);
if( strcmp(*argv, arr1) == 0 | strcmp(*argv, buff) == 0 )//比较字符串
{
printf("登录系统成功\n");
printf("请输入修改用户密码:");
scanf("%s",in1);
file_fd1 = open(FILE1, O_RDWR|O_TRUNC);//打开并清空文件
write(file_fd1,in1 ,strlen(in1));//写入刚修改的密码
close(file_fd1);
printf("密码修改成功\n");
}else{
printf("登录系统失败\n");
}
return 0;
}