鱼C论坛

 找回密码
 立即注册
查看: 1472|回复: 0

[技术交流] c语言写的一个密码本

[复制链接]
发表于 2018-10-19 18:58:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个小项目主要实现的是用C语言自带的文件控制函数来读写文本内容,实现增删改查

这次用的是fwrite和fread函数来读写文本。

在这里,我遇到了一个问题,头疼比较久,就是在用fread 读取文件后,如果你要对文件里面的一个值修改,这样的话必须要调整光标位置,然后才能写到文本里面,如果没有调整光标位置,及时你在内存中修改了值也不能写到文件中。

错误代码如下:

scanf_s("%s",&scwad[0].Pass,20);
/*这里是在一个结构体中修改一个成员的值,
执行这行语句的时候内存的 值是已经被修改了。*/
fwrite(scwad, sizeof(account), 100, newfile);
/*如果这样直接写入文件,文件是没有任何变化的,
所以在执行这个这个文件之前,要执行fseek函数来重新定位光标的位置。*/


  接下来是正式代码(main)

#include <stdio.h>
#include<stdlib.h>
#include"SavePW.h"


extern account cWhAD[100];
account scwad[100];
int main(){
loop:
        ;
        system("cls");
        int i;

        int j = 0;
    printf("1、保存账号密码\n");
        printf("2、修改账号密码\n");
        printf("3、账号密码查询\n");
        printf("4、删除账号密码\n\n");
       

       
        while (1)
        {
                printf("输入你要用的功能编号:\n");
                scanf_s("%d", &i);
                if (i >= 1 && i <= 4){
                switch (i)
                {
                case 1: j=SavePSW(); break;
                case 2: j=modPW(); break;
                case 3: j=inqu(); break;
                case 4: j=delte(); break;
                }
                break;
                }
                else
                {
                        printf("请输入数字1-4\n");
                }
               
               
        }
        if (j == 1){
                goto loop;
        }
        system("pause");

}

//密码修改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"SavePW.h"
//修改账号密码
extern account cWhAD[100];
extern account scwad[100];

int modPW(){
        FILE* newfile;
        char a[20];
        int i = 0;
        /*char rePassword[20];*/
        fopen_s(&newfile, "123.bin", "rb+");
        while (1)
{

        system("cls");
        //fseek(newfile,0, SEEK_SET);
        printf("请问你要修改哪个账号\n");
        //scanf_s("%s",&i,10);
        scanf_s("%s", &a,20);
        //取出所有文本信息
        fread(scwad, sizeof(account), 100, newfile);
        /////////////////////////////////////
        ////////////////////找到账号的位置///
        for (int i = 0; i <100; i++)
        {
                if (strcmp(a, scwad[i].Name)==0){
                        printf("找到了!\n");
                        printf("给%s的账号修改密码\n", scwad[i].Name);
                        scanf_s("%s",&scwad[i].Pass,20);
                        //对密码进行加密
                        for (int K = 0; K < sizeof(scwad[i].Pass); K++)
                        {
                                scwad[i].Pass[K] = scwad[i].Pass[K] ^ 5;
                        }
                        /////////
                        fseek(newfile, 0, SEEK_SET);//因为光标会消失,重新指定光标位置
                        fwrite(scwad, sizeof(account), 100, newfile);//从1一开覆盖
                        break;
                }
        }
        printf("按1重新输入,按2回首页,其他键退出!");
        scanf_s("%d", &i, 1);
        if (i == 1)
        {
               
                continue;
        }
        else if (i == 2)
        {
                fclose(newfile);
                return 1;
        }
        else
        {
                fclose(newfile);
                return 0;
        }
}
        fclose(newfile);
   
}


/*
fread(&scwad[0].ID, sizeof(account), 1, newfile);
fread(&scwad[0].Pass, sizeof(account), 1, newfile);
printf("%s\n", scwad[0].Name);
printf("%s\n", scwad[0].ID);
printf("%s\n", scwad[0].Pass);*/


//密码保存
#include<stdio.h>
#include"SavePW.h"
account cWhAD[100];

int SavePSW()
{
       
                FILE* newFile;
                int i,j=0;
                char c[20];
                fopen_s(&newFile, "123.bin", "ab+");
                while (1)
                {
                        system("cls");
                        printf("请问你想保存哪里的账号(填写以后便于查找)?\n");
                        scanf_s("%s", &cWhAD[j].Name, 20);
                        //fwrite(&cWhAD[j].Name,sizeof(account),1,newFile);
                        printf("请填写账号:\n");
                        scanf_s("%s", &cWhAD[j].ID, 20);
                        //fwrite(&cWhAD[j].ID, sizeof(account), 1, newFile);
                        printf("请填写密码:\n");
                        scanf_s("%s", &cWhAD[j].Pass, 20);
                        //对密码进行加密
                        for (int K = 0;  K < sizeof(cWhAD[j].Pass);  K++)
                        {
                                cWhAD[j].Pass[K] = cWhAD[j].Pass[K] ^5;
                        }
                        ////S
                        fwrite(&cWhAD[j], sizeof(account), 1, newFile);
                        //fprintf(newFile, "%s,%s,%s\r\n", cWhAD[j].Name, cWhAD[j].ID, cWhAD[j].Pass);
                        //fwrite(&cWhAD[j], sizeof(account), 100, newFile);
                        printf("你已经输入完成,按1再次输入,按2返回首页,按其他键退出");
                        scanf_s("%d",&i,1);
                                if (i==1)
                        {
                                j++;
                                continue;
                        }
                                else if (i==2)
                        {
                                fclose(newFile);
                                return 1;
                        }
                                else
                        {
                                fclose(newFile);
                                return 0;
                        }
                 }
               
       
                fclose(newFile);
       
}


//账号搜索
#include<stdio.h>
#include<stdlib.h>
#include"SavePW.h"

extern account scwad[100];
int inqu(){

        FILE* newfile;
        char a[20];
        int i = 0;
        fopen_s(&newfile, "123.bin", "rb+");

        while (1)
        {
                system("cls");
                printf("你要查找的账号\n");
                //scanf_s("%s",&i,10);
                scanf_s("%s", &a, 20);
                //把信息导出来
                fread(scwad, sizeof(account), 100, newfile);
                for (int i = 0; i < 100; i++)
                {
                        //fread(&scwad[i].Name, sizeof(account), 1, newfile);
                        if (strcmp(a, scwad[i].Name) == 0){
                                printf("找到了!\n");
                                //fread(&scwad[i].ID, sizeof(account), 1, newfile);
                                printf("账号为:%s\n", scwad[i].ID);
                                //fread(&scwad[i].Pass, sizeof(account), 1, newfile);
                                printf("密码(此时为加密状态)为:%s\n", scwad[i].Pass);
                                break;
                        }

                }
                printf("按1重新输入,按2回首页,其他键退出!");
                scanf_s("%d", &i, 1);
                if (i == 1)
                {

                        continue;
                }
                else if (i == 2)
                {
                        fclose(newfile);
                        return 1;
                }
                else
                {
                        fclose(newfile);
                        return 0;
                }
                fclose(newfile);
        }

}

//账号删除

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"SavePW.h"

extern account cWhAD[100];
extern account scwad[100];

int delte(){

        FILE* newfile;
        char a[20];
        int i = 0;
        fopen_s(&newfile, "123.bin", "rb+");
        while (1)
        {
                system("cls");
                printf("请问你要删除哪个账号\n");
                scanf_s("%s", &a, 20);
                fread(scwad, sizeof(account), 100, newfile);
                for (int i = 0; i < 100; i++)
                {
                        fread(&scwad[i].Name, sizeof(account), 1, newfile);
                        if (strcmp(a, scwad[i].Name) == 0){
                                printf("找到了!按三次0进行确认\n");
                                scanf_s("%s", &scwad[i].Pass, 20);
                                scanf_s("%s", &scwad[i].Name, 20);
                                scanf_s("%s", &scwad[i].ID, 20);
                                printf("已经删除%s", scwad[i].Name);

                                ////
                                for (int K = 0; K < sizeof(scwad[i].Pass); K++)
                                {
                                        scwad[i].Pass[K] = NULL;
                                        scwad[i].Name[K] = NULL;
                                        scwad[i].ID[K] = NULL;
                                }
                                ////
                                fseek(newfile, 0, SEEK_SET);
                                fwrite(scwad, sizeof(account), 100, newfile);
                                /*scanf_s("%s", &scwad[i].Pass, 20);
                                fwrite(&scwad[i].Pass, sizeof(account), 1, newfile);
                                printf("%s", scwad[i].Pass);*/
                                break;
                        }

                }
                printf("按1重新输入,按2回首页,其他键退出!");
                scanf_s("%d", &i, 1);
                if (i == 1)
                {

                        continue;
                }
                else if (i == 2)
                {
                        fclose(newfile);
                        return 1;
                }
                else
                {
                        fclose(newfile);
                        return 0;
                }
        }
        fclose(newfile);
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 14:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表