c++—简单的密码本实现

主要实现功能有增删改查数据,本地读取保存。

数据存储设计 data.h data.cpp

#pragma once
#define 添加账户      1
#define 删除账户      2
#define 修改账户      3
#define 查询账户      4
#define 查询所有      5
#define 保存本地      6
#define 退出          7

#define NUM 100
extern int g_nNum; //当前密码本容量
extern int oCho;    //判断是否保存到本地了

//定义账户结构体
typedef struct _ACCOUNT
{
    char website[100];
    char userName[100];
    char passWord[100];
}ACCOUNT,*PACCOUNT;
#include "data.h"
int g_nNum;

函数方法的实现:

ctrl.h

#pragma once
#include "data.h"
//增加账户
void insertInfo(ACCOUNT acc[], int* nCount);
//删除账户
void deleteInfo(ACCOUNT acc[], int *nCount);
//修改账户
void alterInfo(ACCOUNT acc[], int nCount);
//查询账户
void searchInfo(ACCOUNT acc[], int nCount);
//查询所有账户
void searchALLInfo(ACCOUNT acc[], int nCount);
//保存操作
void saveInfo(ACCOUNT acc[], int nCount);
//读取数据
void readInfo(PACCOUNT *pAc, int *nCount);

ctrl.cpp

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "data.h"
#include "ctrl.h"
void insertInfo(ACCOUNT acc[], int* nCount)
{

    int nNum = *nCount;
    if (nNum <0 || nNum > NUM)
    {
        printf("添加异常请重试!\n");
            return;
    }
    printf("请输入需要保存的站点:\n");
    scanf_s("%s", acc[nNum].website,100);
    char ss = getchar();
    printf("请输入需要保存的用户名:\n");
    scanf_s("%s", acc[nNum].userName,100);
     ss = getchar();
    printf("请输入需要保存的密码:\n");
    scanf_s("%s", acc[nNum].passWord,100);
     ss = getchar();
    (*nCount)++;
    printf("保存成功!返回主菜单\n");
    
}

void deleteInfo(ACCOUNT acc[], int* nCount) 
{
    int nNum = *nCount;
    if (nNum <0 || nNum > NUM)
    {
        printf("有点小毛病我也不知道咋回事你再试试!\n");
        return;
    }
    char str[100] = {};
    printf("请输入你想要删除的站点:\n");
    scanf_s("%s", str, 100);
    for (int i = 0; i < nNum; i++)
    {
        if (strcmp(str, acc[i].website) == 0)
        {
            for (int j=i;j<nNum-1;j++)
            {
                strcpy_s(acc[j].website, 100, acc[j + 1].website);
                strcpy_s(acc[j].userName, 100, acc[j + 1].userName);
                strcpy_s(acc[j].passWord, 100, acc[j + 1].passWord);
            }
            
            printf("删除成功!\n");
            (*nCount)--;
            return;
        }
        
    }
    printf("查无此站点请重试!\n");
}

void alterInfo(ACCOUNT acc[], int nCount)
{
    char str[100] = {};
    printf("请输入你想要修改的站点:\n");
    scanf_s("%s", str, 100);
    for (int i = 0; i < nCount; i++)
    {
        if (strcmp(str, acc[i].website) == 0)
        {
            
            printf("请输入修改后的站点:\n");
            scanf_s("%s", acc[i].website, 100);
            printf("请输入修改后的用户名:\n");
            scanf_s("%s", acc[i].userName, 100);
            printf("请输入修改后的密码:\n");
            scanf_s("%s", acc[i].passWord, 100);
            printf("修改成功!\n");
            return;
        }
        
    }
    printf("查无此站点请重试!\n");
}

void searchInfo(ACCOUNT acc[], int nCount)
{
    char str[100] = {};
    printf("请输入你想要查询的站点:\n");
    scanf_s("%s", str, 100);
    for (int i = 0;i<nCount;i++)
    {
        if (strcmp(str,acc[i].website) ==0)
        {
            printf("查询结果为:\n");
            printf("站  点:%s  \n", acc[i].website);
            printf("用户名:%s  \n", acc[i].userName);
            printf("密  码:%s  \n", acc[i].passWord);
            return;
        }
    }
    printf("暂无搜索结果\n");

}

void searchALLInfo(ACCOUNT acc[], int nCount)
{
    
    printf("-------------查询结果----------------\n");
    if (0==nCount)
    {
        printf("空\n");
        return;
    }
    
    for (int i = 0; i< nCount; i++)
    {
        printf("站  点:%s  \n",acc[i].website);
        printf("用户名:%s  \n",acc[i].userName);
        printf("密  码:%s  \n",acc[i].passWord);
        printf("--------------------------------\n");
    }
}


void saveInfo(ACCOUNT acc[], int nCount)
{
    FILE* pFile=NULL;
    errno_t err = fopen_s(&pFile, "file.txt", "wb");
    if (err != 0)
    {
        printf("保存本地失败!\n");
        return ;

    }
    g_nNum = nCount;
    fwrite(&nCount, sizeof(nCount), 1, pFile);
    fwrite(&g_nNum, sizeof(g_nNum), 1, pFile);
    int bytsize = sizeof(ACCOUNT) * g_nNum;
    char* buf = (char*)malloc(bytsize);
    memcpy_s(buf, bytsize, acc, bytsize);
    for (int i = 0; i < bytsize; i++)
    {
        buf[i] += 2;
    }
    fwrite(buf, sizeof(ACCOUNT), g_nNum, pFile);
    fclose(pFile);
    free(buf);
    buf = NULL;
    printf("已成功保存到本地!\n");
}
void readInfo(PACCOUNT *pAc, int *nCount)
{

    FILE* pFile=NULL;
    errno_t err = fopen_s(&pFile, "file.txt", "rb");
    if (err != 0)
    {
        *pAc = (PACCOUNT)malloc(sizeof(ACCOUNT) * NUM);
        g_nNum = NUM;
        return ;
    }
    fread(nCount, sizeof(nCount), 1, pFile);
    fread(&g_nNum, sizeof(g_nNum), 1, pFile);
    if (g_nNum==0)
    {
        *pAc= (PACCOUNT)malloc(sizeof(ACCOUNT));
        fclose(pFile);
        return;
    }
    *pAc = (PACCOUNT)malloc(sizeof(ACCOUNT) * g_nNum);
    memset(*pAc, 0, sizeof(ACCOUNT) * g_nNum);
    size_t lent = fread(*pAc, sizeof(ACCOUNT), g_nNum, pFile);
    if (lent!=g_nNum)
    {
        printf("读取错误!");
        fclose(pFile);
        return;
    }
    int bytsize = sizeof(ACCOUNT) * g_nNum;
    char* buf = (char*) *pAc;
    for (int i = 0; i < bytsize; i++)
    {
        buf[i] -= 2;
    }
    
    fclose(pFile);
    
}

主界面 menuMain.cpp

#include <stdio.h>
#include <malloc.h>
#include "data.h"
#include "ctrl.h"
#include <stdlib.h>
int main()
{
    int g_nNum = 0; //当前密码容量
    int nCount = 0; //当前密码个数
    PACCOUNT pAc = nullptr;
    readInfo(&pAc, &nCount);
    //pAc = (PACCOUNT)malloc(sizeof(ACCOUNT) * NUM);
    int nOver = 1;
    int oper;
    int oCho = 0;
    printf("欢迎使用尘风密码本\n");
    while (nOver)
    {
        printf("======主菜单===========\n");
        printf("1 添加账户\n");
        printf("2 删除账户\n");
        printf("3 修改账户\n");
        printf("4 查询账户\n");
        printf("5 查询所有账户\n");
        printf("6 保存本地\n");
        printf("7 退出\n");
        printf("请输入你想要进行的操作序号:\n");
        scanf_s("%d",&oper);

        switch (oper)
        {
        case 添加账户:
        {
            insertInfo(pAc, &nCount);
            oCho += 1;
        }
            break;
        case 删除账户:
        {
            deleteInfo(pAc, &nCount);
            oCho += 1;
        }
            break;
        case 修改账户:
        {
             alterInfo(pAc,nCount);
             oCho += 1;

        }
            break;
        case 查询账户:
        {
            searchInfo(pAc, nCount);
            
        }
                break;
        case 查询所有: 
        {
            searchALLInfo(pAc, nCount);
        }
                break;
        case 保存本地: 
        {
            saveInfo(pAc, nCount);
            oCho = 0;
        }
                break;
        case 退出:
        {
            if (oCho!=0)
            {
                printf("更改是否保存到本地?(y or 其他)\n");
                char x = getchar();
                char s;
                scanf_s("%c", &s,1);        
                if ('y'== s)
                {
                    saveInfo(pAc, nCount);
                }

            }
            printf("谢谢您的使用!");
            nOver = 0;
            system("pause");
            system("cls");
            
        }
                break;
        default:
        {
            printf("请输入正确命令");
        }
            break;
        }
        
    }
    free(pAc);
    pAc = nullptr;

}

 

转载于:https://www.cnblogs.com/mountainCold/p/11191068.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值