教师评价:

□算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理;

□实验结果正确; □语法、语义正确; □报告规范;

其他:

评价教师签名:

一、实验目的

1、掌握字符如何在文件中读取和存储。

2、掌握字符的的简单加密和解密。

3、掌握字符串的复制、查询、比较、连接、长度等基本C语言库函数。

二、实验项目内容(实验题目)

1)如果file1.dat不存在,就建立file1.dat。并在文件file1.dat中存入两个字符串,第1行是帐号,第2行是密码。

2)如果file2.dat不存在,就建立file2.dat。加密规则是将文件file1.dat中的密码的每一字与0x6a异或变成另一个字符送屏幕显示,同时存入文件file2.dat中。

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

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

三、源程序(实验过程或算法)

1、算法如下

一、执行注册程序:以只读方式打开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比较,如果一致则显示登录成功,否则显示登录失败。

2、源程序如下

#include
#include
#include
#define N 0x6a
int main()
{
FILE *fp1,*fp2;
fp1=fopen("file1.dat","r");
if(fp1==NULL)
{
fp1=fopen("file1.dat","w+");
printf("开始注册\n");
char a[10],b[10];
printf("请输入账号:\n");
gets(a);
fputs(a,fp1);
fputc('\n',fp1);
printf("请输入密码:\n");
gets(b);
fputs(b,fp1);
fclose(fp1);
}
else
{
char a[10],b[10],ch,x,y,z;
int m=0,n=0;
fseek(fp1,0,SEEK_SET);
while((x=fgetc(fp1))!='\n')
{
a[m]=x;
m++;
}
a[m]='\0';
while((z=fgetc(fp1))!=EOF)
{
b[n]=z;
n++;
}
b[n]='\0';
fclose(fp1);
fp2=fopen("file2.dat","r");
if(fp2==NULL)
{
fp2=fopen("file2.dat","w+");
for(int i=0;i<10;i++)
{
ch=b[i]^N;
putchar(ch);
fputc(ch,fp2);
}
printf("\n");
fclose(fp2);
}
else
{
printf("开始登录\n");
char c[10],d[10],p[10];int j=0;
printf("请输入账号:\n");
gets(c);
printf("请输入密码:\n");
gets(d);
fseek(fp2,0,SEEK_SET);
while((ch=fgetc(fp2))!=EOF)
{
char a=ch^N;
p[j]=a;
j++;
}
p[j]='\0';
if((strcmp(a,c)==0)&&(strcmp(p,d)==0))
printf("登录成功");
else
printf