主要实现功能有增删改查数据,本地读取保存。
数据存储设计 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;}