struct sysuser{ /*定义系统用户帐号信息结构*/
char username[20];
char password[8];
};
void encrypt(char *pwd);
int main(void)
{
FILE *fp; /*1.定义文件指针*/
int i;
struct sysuser su;
/*2.打开文件,进行写入操作*/
if((fp=fopen("f12-2.txt","w")) == NULL){
printf("File open error!\n");
exit(0);
}
/*3. 将5位用户帐号信息写入文件*/
for(i = 1;i <= 5;i++){
printf("Enter %i th sysuser(name password):",i);
scanf("%s%s",su.username, su.password); /*输入用户名和密码 */
encrypt(su.password); /*进行加密处理*/
fprintf(fp,"%s %s\n", su.username, su.password); /*写入文件*/
}
if(fclose(fp)){ /*4.关闭文件*/
printf("Can not close the file!\n");
exit(0);
}
return 0;
}
///*加密算法*/
void encrypt(char *pwd)
{
int i;
/*与15(二进制码是00001111)异或,实现低四位取反,高四位保持不变*/
for(i = 0; i < strlen(pwd); i++){
pwd[i] = pwd[i] ^ 15;
}
}
struct sysuser{ /*定义系统用户信息结构*/
char username[20];
char password[8];
};
void encrypt(char *pwd);
int checkUserValid(struct sysuser *psu);
int main(void)
{
struct sysuser su;
printf("Enter username:");
scanf("%s", su.username); /*输入待校验的用户名*/
printf("Enter password:");
scanf("%s",su.password); /*输入待校验的密码*/
if(checkUserValid(&su) == 1){ /*调用函数进行校验*/
printf("Valid user!\n"); /*成功输出Valid user!*/
}else{
printf("Invalid user!\n"); /*失败输出Invalid user!*/
}
return 0;
}
/*加密算法*/
void encrypt(char *pwd)
{
int i;
/*与15异或,实现低四位取反,高四位保持不变*/
for(i = 0; i < strlen(pwd); i++){
pwd[i] = pwd[i] ^ 15;
}
}
/*校验用户信息的合法性,成功返回1,否则返回0*/
int checkUserValid(struct sysuser *psu)
{
FILE *fp;
char usr[30], usr1[30], pwd[10];
int check = 0; /*检查结果变量,初始化为0*/
/*连接生成待校验字符串*/
strcpy(usr,psu->username); /*复制psu->username到usr1 */
strcpy(pwd,psu->password); /*复制psu->password到pwd */
encrypt(pwd); /*调用例12-2的encrypt对密码进行加密*/
/*连接usr、空格、pwd和\n构成新字符串usr,用于在文件中检查匹配*/
strcat(usr, " ");
strcat(usr, pwd);
strcat(usr, "\n");
/*打开文件"f12-2.txt"读入*/
if((fp=fopen("f12-2.txt","r")) == NULL){
printf("File open error!\n");
exit(0);
}
/*从文件读入用户信息数据,遍历判断是否存在*/
while(!feof(fp)){
fgets(usr1, 30, fp); /*读入一行用户信息字符串到usr1*/
if(strcmp(usr, usr1) == 0){ /*比较判断usr与usr1是否相同*/
check = 1;
break;
}
}
/*关闭文件*/
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
return check;
}
----------------------------------------------------
long size; /* 用来保存sizeof(struct LogData)*/
struct LogData{ /*记录的结构*/
long logid; /*记录ID*/
char logdate[11]; /*记录发生日期*/
char lognote[15]; /*记录事件说明*/
double charge; /*发生费用:正表示收入,负表示支出*/
double balance; /*余额*/
};
int inputchoice() /*选择操作参数*/
{
int mychoice;
printf("\nEnter your choice:\n");
printf("1 - Add a new cash LOG.\n2 - List All Cash LOG.\n");
printf("3 - Query Last Cash LOG.\n0 - End program.\n");
scanf("%d", &mychoice);
return mychoice;
}
long getLogcount(FILE *cfptr) /*获取文件记录总数*/
{
long begin, end, logcount;
fseek(cfptr, 0L, SEEK_SET);
begin = ftell(cfptr);
fseek(cfptr, 0L, SEEK_END);
end = ftell(cfptr);
logcount = (end-begin)/size;
return logcount;
}
void ListAllLog(FILE *cfptr) /*列出所有收支流水记录*/
{
struct LogData log;
fseek(cfptr,0L,SEEK_SET); /*定位指针到文件开始位置*/
fread(&log,size,1,cfptr);
printf("logid logdate lognote charge balance\n");
while(!feof(cfptr)){
printf("%6ld %-11s %-15s %10.2lf %10.2lf\n", log.logid, log.logdate, log.lognote, log.charge, log.balance);
fread(&log, size, 1, cfptr);
}
}
void QueryLastLog(FILE *cfptr) /*查询显示最后一条记录*/
{
struct LogData log;
long logcount;
logcount = getLogcount(cfptr);
if(logcount > 0){ /*表示有记录存在*/
fseek(cfptr, size*(logcount-1), SEEK_SET); /*定位最后记录*/
fread(&log, size, 1, cfptr); /*读取最后记录*/
printf("The last log is:\n");
printf("logid:%-6ld\nlogdate:%-11s\nlognote:%-15s\n", log.logid, log.logdate, log.lognote);
printf("charge:%-10.2lf\nbalance:%-10.2lf\n", log.charge, log.balance); /*显示最后记录内容*/
}else{
printf("no logs in file!\n");
}
}
void AddNewLog(FILE *cfptr) /*添加新记录*/
{
struct LogData log, lastlog;
long logcount;
printf("Input logdate(format:2006-01-01):");
scanf("%s", log.logdate);
printf("Input lognote:");
scanf("%s", log.lognote);
printf("Input Charge:Income+ and expend-:");
scanf("%lf", &log.charge);
logcount = getLogcount(cfptr); /*获取记录数*/
if(logcount>0){
fseek(cfptr,size*(logcount-1),SEEK_SET);
fread(&lastlog, size, 1, cfptr); /*读入最后记录*/
log.logid = lastlog.logid + 1; /*记录号按顺序是上次的号+1*/
log.balance = log.charge + lastlog.balance;
}else{ /*如果文件是初始,记录数为0*/
log.logid = 1;
log.balance = log.charge;
}
rewind(cfptr);
printf("logid= %ld\n", log.logid);
fwrite(&log, sizeof(struct LogData), 1, cfptr); /*写入记录*/
}
int main()
{
FILE *fp;
int choice;
if((fp = fopen("cashbox.txt", "ab+")) == NULL){
printf("can not open file cashbox.txt!\n");
exit(0);
}
size = sizeof(struct LogData);
while((choice = inputchoice()) != 0){
switch(choice){
case 1: /*添加新记录*/
AddNewLog(fp);
break;
case 2: /*列出所有收支流水记录*/
ListAllLog(fp);
break;
case 3: /*查询最后的余额*/
QueryLastLog(fp);
break;
default:
printf("Input Error.");break;
}
}
if(fclose(fp) != 0){
printf( "Can not close the file!\n" );
exit(0);
}
return 0;
}