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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerShell在Exchange2010下快速创建动态通讯组

Exchange中遇到一个小需求&#xff0c;有很多部门要申请动态通信组&#xff0c;问题是二级部门三级部门四级部门非常非常多。……Get-ADObject -LDAPFilter "(&(&(ou>"")))" -SearchBase OUxx,OUxxx,DCxxx,DCxxx,DCcom -Properties CanonicalNa…

LeetCode—262. 行程和用户(困难)

262. 行程和用户(困难) 题目描述&#xff1a; 取消率 的计算方式如下&#xff1a;(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 写一段 SQL 语句查出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户&#xff08;乘客和司机都必须未被禁止…

动态创建数据库

动态创建数据库&#xff0c;就是不在sql企业管理器中设计数据库&#xff0c;而是在程序中建库并建表。 我原来对用程序操作数据库的概念总是先有一个跟数据库的连接&#xff0c;再用command对数据库操作。但这一次发现问题了&#xff0c;还没有我要创建的数 据库&#xff0c…

第五章 数组和指针的关系

如果对声明数组的语句不太明白的话&#xff0c;请参阅我前段时间贴出的文章<<如何理解c和c的复杂类型声明>>。 数组的数组名其实可以看作一个指针。看下例&#xff1a; 例八&#xff1a; int array[10]{0,1,2,3,4,5,6,7,8,9},value; ... ... valuearray[0];//也可写…

第5章 JVM调优

2019独角兽企业重金招聘Python工程师标准>>> ##5.1 Java虚拟机内存模型## Java虚拟机内存模型是Java程序运行的基础。JVM将其内存数据分为程序计数器&#xff0c;虚拟机栈&#xff0c;本地方法栈&#xff0c;Java堆和方法区等部分。 程序计数器&#xff1a;用于存放…

C语言讲义——字符串

字符数组 C语言字符串就是字符数组。 单写字符&#xff0c;用单引号。如&#xff1a;’A’。字符串用双引号。如&#xff1a;”A”、”ABC”。#include <stdio.h> main() {char c1 a;printf("%c\n", c1-1);printf("%c\n", c1);printf("%c\n&qu…

怎样在PHP中通过ADO调用Asscess数据库和COM程序

PHP4已经支持Microsoft的COM技术。然而文档中在COM部分却提得很少。 这儿是几个我试过的例子。希望这些给你一些概念。注意的是这些只能运行在32位的Microsoft Windows平台下。 用php激活ADO ADO是Microsoft的数据库对象技术。ADO里面包括连接数据库的对象&#xff0c;从查询…

LeetCode—264. 丑数 II

264. 丑数 II 题目描述&#xff1a; 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和1或 5 的正整数。 考察重点&#xff1a;动态规划。可以写出转移方程&#xff1a;res[i]min(res[p1]2,res[p2]3,res[p3]5)&#xff0c;其中res表…

grep与正则表达式

http://my.unix-center.net/~Simon_fu/?p469 虽然正则表达式经常都在用&#xff0c;但是很少能够静下心来仔细的总结一下。最近看了一个台湾人的网站叫做鸟哥Linux私房菜&#xff0c;关于正则表达式的描述挺详细的。在此&#xff0c;我进行一下总结&#xff0c;如果想仔细的学…

c基础--II

c基础&#xff0d;&#xff0d;II 数据输出putchar()函数#include "stdio.h"main(){ char a,b,c; aa; bb; cc; //putchar()函数 putchar(a); putchar(b); putchar(c);}printf()函数printf(格式控制&#xff0c;输出列表)%d 输出 十进制整数%o 输出 八进…

Chuck Cobb谈敏捷组织中PMO的角色

对于设立了PMO&#xff08;项目管理办公室&#xff09;的企业&#xff0c;实施整个企业向敏捷风格的转换可能需要多个部门同步改变工作方式。在敏捷的团队中&#xff0c;PMO的传统角色需要做出改变。Charles G. “Chuck” Cobb,专家级敏捷项目经理、顾问、图书作者,最近分享了对…

为使用mysql而配置codeblocks工程

心结&#xff1a; 为了在codeblocks下创建的C工程中使用mysql&#xff0c;辛辛苦苦忙活了半个下午&#xff0c;终于长舒一口气&#xff0c;搞定了&#xff0c;编译成功。其中不乏数次的成功于失败的反复。个中滋味&#xff0c;只有让我有擂头顿足的冲动。不过&#xff0c;还算…

Java初学者入门经典:面向对象的思维方法(其实同样非常适合C#的初学者)……非原创,作者忘了,非常抱歉...

我是从学习Java编程开始接触OOP(面向对象编程)&#xff0c;刚开始使用Java编写程序的时候感觉很别扭&#xff0c;因为我早以习惯用C来编写程序&#xff0c;很欣赏C的简洁性和高效性&#xff0c;喜欢C简练而表达能力丰富的风格&#xff0c;特别忍受不了Java运行起来慢吞吞的速度…

极客

2019独角兽企业重金招聘Python工程师标准>>> 极客是美国俚语“geek”的音译。随着互联网文化的兴起&#xff0c;这个词含有智力超群和努力的语意&#xff0c;又被用于形容对计算机和网络技术有狂热兴趣并投入大量时间钻研的人。现代的Geek含义虽然与过去有所不同&am…

大数据——SparkStreaming学习笔记

Spark 一、SparkStreaming ​ Spark Streaming 用于流式数据的处理&#xff08;准实时&#xff0c;微序列&#xff09;。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、 Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark…

[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)

[推荐]ORACLE SQL&#xff1a;经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) [推荐]ORACLE SQL&#xff1a; 经典查询练手第三篇(不懂装懂&#xff0c;永世饭桶&#xff01;) ——通过知识共享树立个人品牌。 本文与大家共同讨论与分享ORACLE SQL的一些常用经…

ACM试题 - ASCII码排序 - Java中字符与对应ASCII码的转换

Java中字符转换对应ASCII码有两种方式&#xff1a; 第一种&#xff1a; char c a; byte b (byte)c; // b97 第二种&#xff1a; char c a; int b c; // b97 而一个ASCII码转换成相应字符则仅需强制转换&#xff1a; int a 97; char c (char)a; // ca ACM试…

DotNET多线程使用初探

最近几周一直在做DotNET WinForm开发&#xff0c;陆陆续续有些收获&#xff0c;希望能够有空好好整理整理。记下来以免以后又忘了。:-) 一、最简单的线程使用方法 新建一个C# Windows应用程序项目&#xff0c;在最前面的引用代码那增加一行using System.Threading;在界面上扔个…

Linux mount: Structure needs cleaning 错误解决方法

“mount: Structure needs cleaning”报错可以使用xfs_repair来修复&#xff0c;但是要注意 xfs_repair修复的分区中的文件都会丢失&#xff0c;即使是du能正常显示的文件也会丢失。 [rootyw-0-0 /]# mount -a mount: Structure needs cleaning[rootyw-0-0 /]# xfs_repair /dev…