C语言简单的文件操作

账户密码文件存储实验

问题描述

  1. 如果 file1.dat不存在,就建立file1.dat,并在文件file1.dat中存入两个字符串,第1行是姓名(姓名使用拼音)学号,中间用隔开,第2行是密码,密码不超过20位

  2. 如果file2.dat不存在,就建立file2.dat

加密规则:

将文件file1.dat中的密码中的每一个字符与 0x6e 异或变成另一个字符送屏幕显示,同时存入文件file2.dat

执行登陆程序,要求输入账号和密码,并和file2.dat中解密(解密和加密采用同样的算法)得到的账号和密码进行比较,如果一致则显示登录成功,否则显示登录失败

加密和解密的方法可以设计的复杂一些

算法

执行注册程序:

以只读方式打开 file1.dat,若不成功,则建立file1.dat

分别用字符数组a,b存放注册时录入的账号密码,并 fputsfile1.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, 然后就会显示登陆成功了

还是学到了很多东西的,特别是异或运算,有时间还是要研究一下

登陆成功:

登录失败:

(0)

相关推荐