C语言简单的文件操作
账户密码文件存储实验
问题描述
如果 file1.dat不存在,就建立file1.dat,并在文件file1.dat中存入两个字符串,第1行是姓名(姓名使用拼音)学号,中间用隔开,第2行是密码,密码不超过20位
如果file2.dat不存在,就建立file2.dat
加密规则:
将文件file1.dat中的密码中的每一个字符与 0x6e 异或变成另一个字符送屏幕显示,同时存入文件file2.dat中
执行登陆程序,要求输入账号和密码,并和file2.dat中解密(解密和加密采用同样的算法)得到的账号和密码进行比较,如果一致则显示登录成功,否则显示登录失败
加密和解密的方法可以设计的复杂一些
算法
执行注册程序:
以只读方式打开 file1.dat,若不成功,则建立file1.dat
分别用字符数组a,b存放注册时录入的账号密码,并 fputs入file1.dat
开始加密:
以只读方式打开file2.dat,若不成功,则建立file2.dat
将数组b(即密码)每个元素与 0x6a 异或后送屏幕显示,并 fputc入文件file2.dat中
加密后解密:
以只读方式打开file2.dat,若成功,则开始解密和登录程序
从file2.dat中读出的加密后的密码并与 0x6a 再次异或后用数组p存放
执行登录程序:
分别用字符数组c,d存放登录时录入的账号密码,并用 strcmp函数分别与数组a,p比较,如果一致则显示登录成功,否则显示登录失败
源代码
关于登录程序,我是引用了一个自定义的头文件,头文件的内容见第二个代码块,该实验比较简单,主要是对文件的读取和写入操作,期间还有异或运算,总之,我感觉C语言又拾回来了好多东西,啊哈哈哈~~
#include<stdio.h>
#include<string.h>
#include"signIn.h" //自定义头文件引用登录程序
#define MATH 0x6e //要异或的16进制数
#define size 100 //数组大小
int main()
{
char tr(char str); //两行函数声明
char untr(char str);
FILE *file1; //两个文件指针分别指向file1.dat和fille2.dat
FILE *file2;
int i=0;
char fileOneName[]="C:\\Users\\dell\\Desktop\\file1.dat"; //文件路径
char fileTwoName[]="C:\\Users\\dell\\Desktop\\file2.dat";
char stuName[size]={'\0'}; //数组初始化
char pwd[size]={'\0'};
char twoStu[size]={'\0'};
char twoPwd[size]={'\0'};
printf("注册程序\n"); //注册程序
printf("账号:");
gets(stuName);
printf("密码:") ;
gets(pwd);
int length=strlen(pwd);
char pwdTempOne[size]; //定义两个临时存储密码的数组
char pwdTempTwo[length];
strncpy(pwdTempTwo,pwd,length); //把密码给临时数组2
file1=fopen(fileOneName,"w"); //不存在就建立文件file1,并fputs入值
fputs(stuName,file1);
fputs("\n",file1);
fputs(pwd,file1);
fclose(file1);
for(i=0;i<length;i++) //对每个字符加密
{
pwdTempOne[i]=tr(pwd[i]);
}
printf("异或后的字符如下:\n"); //送黑窗显示加密后的字符
puts(pwdTempOne);
file2=fopen(fileTwoName,"w"); //不存在就建立文件file2
for(i=0;i<length;i++)
{
fputc(pwdTempOne[i],file2); //把加密后的字符fputc入file2
}
for(i=0;i<length;i++)
{
pwdTempOne[i]=untr(pwdTempOne[i]); //临时数组1存储解密后的字符
}
file2=fopen(fileTwoName,"r");
if(file2!=NULL)
{
printf("\n登录程序:\n"); //登陆程序
printf("请输入账号:\n"); //录入账号
scanf("%s",twoStu);
printf("请输入密码:\n"); //录入密码
scanf("%s",twoPwd);
int shuOne=signIn(twoStu,stuName);
int shuTwo=signIn(twoPwd,pwdTempOne);
if(shuOne==0&&shuTwo==0) //根据函数返回值判断是否登录成功
printf("登陆成功!不用改bug了,头发保住了\n");
else
printf("登陆失败!还要改bug,头发掉光了\n");
}
else
printf("Error\n");
fclose(file2);
return 0;
}
char tr(char str) //加密函数
{
char c;
c=str ^ MATH;
return c;
}
char untr(char str) //解密函数
{
char b;
b=str ^ MATH;
return b;
}
自定义的头文件的内容:
int signIn(char arrayOne[],char arrayTwo[])
{
int k=1; //置于非零位
k=strcmp(arrayOne,arrayTwo); //相同则k=0
return k;
}
结果分析
结果如图所示,经过strcmp的比较,k=0, 然后就会显示登陆成功了
还是学到了很多东西的,特别是异或运算,有时间还是要研究一下
登陆成功:
登录失败: