不用一分钱 发表于 2018-10-19 18:58:09

c语言写的一个密码本

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

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

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

错误代码如下:

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


接下来是正式代码(main)

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


extern account cWhAD;
account scwad;
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;
extern account scwad;

int modPW(){
        FILE* newfile;
        char a;
        int i = 0;
        /*char rePassword;*/
        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.Name)==0){
                        printf("找到了!\n");
                        printf("给%s的账号修改密码\n", scwad.Name);
                        scanf_s("%s",&scwad.Pass,20);
                        //对密码进行加密
                        for (int K = 0; K < sizeof(scwad.Pass); K++)
                        {
                                scwad.Pass = scwad.Pass ^ 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.ID, sizeof(account), 1, newfile);
fread(&scwad.Pass, sizeof(account), 1, newfile);
printf("%s\n", scwad.Name);
printf("%s\n", scwad.ID);
printf("%s\n", scwad.Pass);*/


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

int SavePSW()
{
       
                FILE* newFile;
                int i,j=0;
                char c;
                fopen_s(&newFile, "123.bin", "ab+");
                while (1)
                {
                        system("cls");
                        printf("请问你想保存哪里的账号(填写以后便于查找)?\n");
                        scanf_s("%s", &cWhAD.Name, 20);
                        //fwrite(&cWhAD.Name,sizeof(account),1,newFile);
                        printf("请填写账号:\n");
                        scanf_s("%s", &cWhAD.ID, 20);
                        //fwrite(&cWhAD.ID, sizeof(account), 1, newFile);
                        printf("请填写密码:\n");
                        scanf_s("%s", &cWhAD.Pass, 20);
                        //对密码进行加密
                        for (int K = 0;K < sizeof(cWhAD.Pass);K++)
                        {
                                cWhAD.Pass = cWhAD.Pass ^5;
                        }
                        ////S
                        fwrite(&cWhAD, sizeof(account), 1, newFile);
                        //fprintf(newFile, "%s,%s,%s\r\n", cWhAD.Name, cWhAD.ID, cWhAD.Pass);
                        //fwrite(&cWhAD, 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;
int inqu(){

        FILE* newfile;
        char a;
        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.Name, sizeof(account), 1, newfile);
                        if (strcmp(a, scwad.Name) == 0){
                                printf("找到了!\n");
                                //fread(&scwad.ID, sizeof(account), 1, newfile);
                                printf("账号为:%s\n", scwad.ID);
                                //fread(&scwad.Pass, sizeof(account), 1, newfile);
                                printf("密码(此时为加密状态)为:%s\n", scwad.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;
extern account scwad;

int delte(){

        FILE* newfile;
        char a;
        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.Name, sizeof(account), 1, newfile);
                        if (strcmp(a, scwad.Name) == 0){
                                printf("找到了!按三次0进行确认\n");
                                scanf_s("%s", &scwad.Pass, 20);
                                scanf_s("%s", &scwad.Name, 20);
                                scanf_s("%s", &scwad.ID, 20);
                                printf("已经删除%s", scwad.Name);

                                ////
                                for (int K = 0; K < sizeof(scwad.Pass); K++)
                                {
                                        scwad.Pass = NULL;
                                        scwad.Name = NULL;
                                        scwad.ID = NULL;
                                }
                                ////
                                fseek(newfile, 0, SEEK_SET);
                                fwrite(scwad, sizeof(account), 100, newfile);
                                /*scanf_s("%s", &scwad.Pass, 20);
                                fwrite(&scwad.Pass, sizeof(account), 1, newfile);
                                printf("%s", scwad.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);
}


页: [1]
查看完整版本: c语言写的一个密码本