密码本(无bug版)

 1 main.cpp
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include "data.h"
 6 #include "ctrl.h"
 7 
 8 int main()
 9 {
10     PPASSWORD pPwd = nullptr;   // 密码数组
11     int nCount = 0;            // 当前密码个数
12     g_nNum = 0;            // 当前密码本容量
13 
14     readInfo(&pPwd, &nCount);        // 从本地文件中读取密码,用于初始化密码本
15 
16     
17     while (true)
18     {
19         system("title 欢迎使用密码本");
20         system("color 0E");
21         printf("**************************欢迎使用密码本****************************
");
22         printf("*                                                                *
");
23         printf("*                ---------------------------------               *
");
24         printf("*                    |    Powered By NoThx  |                    *
");
25         printf("*                ---------------------------------               *
");
26         printf("*                                                                *
");
27         printf("*                         请输入你的选择                           *
");
28         printf("*                           1)查看所有                            *
");
29         printf("*                           2)新增密码                            *
");
30         printf("*                           3)删除密码                            *
");
31         printf("*                           4)修改密码                            *
");
32         printf("*                           5)查询密码                            *
");
33         printf("*                           6)生成文件                            *
");
34         printf("*                           0)退出软件                            *
");
35         printf("*                                                                *
");
36         printf("******************************************************************
");
37 
38         OPTION op;
39         scanf_s("%d", &op);
40 
41         switch (op)
42         {
43         case 查看所有:
44             searchAllInfo(pPwd, nCount);
45             break;
46         case 新增:
47             insertInfo(pPwd, &nCount);
48             break;
49         case 删除:
50             deleteInfo(pPwd, &nCount);
51             break;
52         case 修改:
53             alterInfo(pPwd, nCount);
54             break;
55         case 查询:
56             searchInfo(pPwd, nCount);
57             break;
58         case 保存文本:
59             SaveInfoA(pPwd, nCount);
60             break;
61         case 退出软件:
62             exit(0);
63             break;
64         default:
65             break;
66         }
67     }
68 
69 
70     return 0;
71     
72 }
 1 data.h
 2 
 3 #pragma once
 4 
 5 //#define PWD_LEN 20  //密码最大长度
 6 
 7 // 自定义数据类型
 8 //定义所有的用户操作为枚举
 9 enum OPTION {
10 #define 退出软件   0
11 #define 查看所有   1
12 #define 新增       2
13 #define 删除       3
14 #define 修改       4
15 #define 查询       5
16 #define 保存文本   6
17 #define 保存二进制 7
18 };
19 
20 // 定义存储账号密码的结构体
21 typedef struct _PASSWORD
22 {
23     char website[100]; // 站点名
24     char userName[100]; // 用户名
25     char passWord[100]; // 密码
26     char note[100];     // 备注
27 }PASSWORD, *PPASSWORD;
28 
29 // 全局变量, 常量的声明
30 #define NUM 100   // 初始密码本的容量
31 extern int g_nNum;  // 当前密码本容量
1 data.cpp
2 
3 
4 #include "data.h"
5 
6 // 全局变量的定义
7 int g_nNum;
 1 ctrl.h
 2 
 3 #pragma once
 4 
 5 //查看所有密码
 6 void searchAllInfo(PASSWORD pwd[], int nCount);
 7 
 8 //新增密码
 9 void insertInfo(PASSWORD pwd[], int *pnCount);
10 
11 //删除密码
12 void deleteInfo(PASSWORD pwd[], int * pnCount);
13 
14 //修改密码
15 void alterInfo(PASSWORD pwd[], int nCount);
16 
17 //查询密码
18 void searchInfo(PASSWORD pwd[], int nCount);
19 
20 // 保存密码(文本方式)
21 void SaveInfoA(PASSWORD pwd[], int nCount);
22 
23 //保存密码(二进制的方式)
24 void SaveInfoB(PASSWORD pwd[], int nCount);
25 
26 //从本地文件中读取密码,用于初始化密码本
27 void readInfo(PPASSWORD *ppPwd, int * pnCount);// 传递指针是因为希望函数在内部改变这个变量的值
  1 ctrl.cpp
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <string.h>
  6 #include "data.h"
  7 
  8 // 函数声明,否则保存不可用
  9 void SaveInfoB(PASSWORD pwd[], int nCount);
 10 
 11 //查看所有密码
 12 void searchAllInfo(PASSWORD pwd[], int nCount)
 13 {
 14     printf("==共计:%3d 条记录=====================
", nCount);
 15     for (int i = 0; i < nCount; i++)
 16     {
 17         printf("--ID:%3d---------------------
", i);
 18         printf("目标:%s 
", pwd[i].website);
 19         printf("用户名:%s 
", pwd[i].userName);
 20         printf("密码:%s 
", pwd[i].passWord);
 21         printf("备注: %s 
", pwd[i].note);
 22     }
 23 
 24     printf("
");
 25     system("pause");
 26     system("cls");
 27 }
 28 
 29 //新增密码
 30 void insertInfo(PASSWORD pwd[], int *pnCount)
 31 {
 32     int i = *pnCount;
 33     if (i < 0 || i >= NUM)
 34     {
 35         printf("插入位置异常:%d 
", i);
 36         return;
 37     }
 38     printf("请输入<目标站点>
");
 39     scanf_s("%s", pwd[i].website, 100);
 40     printf("请输入<用户名>
");
 41     scanf_s("%s", pwd[i].userName, 100);
 42     printf("请输入<密码>
");
 43     scanf_s("%s", pwd[i].passWord, 100);
 44     printf("请输入<备注信息>
");
 45     scanf_s("%s", pwd[i].note, 100);
 46 
 47     (*pnCount)++;
 48 
 49     SaveInfoB(pwd, *pnCount);
 50 
 51     printf("
");
 52     system("pause");
 53     system("cls");
 54 
 55 }
 56 
 57 //删除密码
 58 void deleteInfo(PASSWORD pwd[], int * pnCount)
 59 {
 60     int i = -1;
 61     printf("请输入待删除项<密码ID>
");
 62     scanf_s("%d", &i);
 63     if (i < 0 || i >= NUM)
 64     {
 65         printf("删除位置异常:%d 
", i);
 66         return;
 67     }
 68 
 69     for (int j = i; j < *pnCount - 1; j++)
 70     {
 71         pwd[j] = pwd[j + 1];
 72     }
 73 
 74     (*pnCount)--;
 75 
 76     SaveInfoB(pwd, *pnCount);
 77 
 78     printf("
");
 79     system("pause");
 80     system("cls");
 81 }
 82 
 83 //修改密码
 84 void alterInfo(PASSWORD pwd[], int nCount)
 85 {
 86     int i = -1;
 87     printf("请输入待修该项<密码ID>
");
 88     scanf_s("%d", &i);
 89     if (i < 0 || i >= NUM)
 90     {
 91         printf("修改位置异常:%d 
", i);
 92         return;
 93     }
 94 
 95         printf("--ID:%3d---------------------
", i);
 96         printf("目标:%s 
", pwd[i].website);
 97         printf("用户名:%s 
", pwd[i].userName);
 98         printf("密码:%s 
", pwd[i].passWord);
 99         printf("备注: %s 
", pwd[i].note);
100         printf("~修改~
");
101 
102         printf("请输入<目标站点>
");
103         scanf_s("%s", pwd[i].website, 100);
104         printf("请输入<用户名>
");
105         scanf_s("%s", pwd[i].userName, 100);
106         printf("请输入<密码>
");
107         scanf_s("%s", pwd[i].passWord, 100);
108         printf("请输入<备注信息>
");
109         scanf_s("%s", pwd[i].note, 100);
110 
111         SaveInfoB(pwd, nCount);
112         
113         printf("
");
114         system("pause");
115         system("cls");
116 }
117 
118 //查询密码
119 void searchInfo(PASSWORD pwd[], int nCount)
120 {
121     char key[100] = { 0 };
122     printf("请输入查找密码的关键字:
");
123     scanf_s("%s", key, 100);
124 
125     // 找出所有匹配项
126     int findPwd[100] = { 0 };
127     int nfindCount = 0;
128     for (int i = 0; i < nCount; i++)
129     {
130         if (strstr(pwd[i].website, key))
131         {
132             findPwd[nfindCount++] = i;
133             continue;
134         }
135         if (strstr(pwd[i].userName, key))
136         {
137             findPwd[nfindCount++] = i;
138             continue;
139         }
140         if (strstr(pwd[i].passWord, key))
141         {
142             findPwd[nfindCount++] = i;
143             continue;
144         }
145         if (strstr(pwd[i].note, key))
146         {
147             findPwd[nfindCount++] = i;
148             continue;
149         }
150     }
151 
152     //打印所有匹配项
153     printf("==共计匹配:%3d 条记录===================
", nfindCount);
154     for (int i = 0; i < nfindCount; i++)
155     {
156         int pos = findPwd[i];
157         printf("--ID:%3d----------------------
", pos);
158         printf("目标:%s 
", pwd[pos].website);
159         printf("用户名:%s 
", pwd[pos].userName);
160         printf("密码:%s 
", pwd[pos].passWord);
161         printf("备注:%s 
", pwd[pos].note);
162     }
163 
164     printf("
");
165     system("pause");
166     system("cls");
167 }
168 
169 // 保存密码(文本方式)
170 void SaveInfoA(PASSWORD pwd[], int nCount)
171 {
172     /*
173     读写文件的固定套路
174     1. 打开文件
175     2. 读写文件
176     3. 关闭文件
177     */
178 
179     // 打开文件
180     FILE *pFile;
181     errno_t err = fopen_s(&pFile, "data.txt", "w");
182     if (err != 0)
183     {
184         return;
185     }
186 
187     // 读写文件
188     fprintf(pFile, "==共计:%3d 条记录==================
", nCount);
189     for (int i = 0; i < nCount; i++)
190     {
191         fprintf(pFile, "目标: %s 
", pwd[i].website);
192         fprintf(pFile, "用户名: %s 
", pwd[i].userName);
193         fprintf(pFile, "密码: %s 
", pwd[i].passWord);
194         fprintf(pFile, "备注: %s 
", pwd[i].note);
195     }
196 
197     // 关闭文件
198     fclose(pFile);
199     printf("保存文本密码成功,使用后请尽快删除!!
");
200     system("pause");
201     system("cls");
202 }
203 
204 //保存密码(二进制的方式)
205 void SaveInfoB(PASSWORD pwd[], int nCount)
206 {
207     // 打开文件
208     FILE *pFile;
209     errno_t err = fopen_s(&pFile, "data.i", "wb");
210     if (err != 0)
211     {
212         return;
213     }
214 
215     // 读写文件
216     fwrite(&nCount, sizeof(nCount), 1, pFile); // 当前密码个数
217     fwrite(&g_nNum, sizeof(g_nNum), 1, pFile); // 当前密码本容量(个数)
218     
219     //先加密(使用中间文件),在存储
220     int byteSize = sizeof(PASSWORD) * g_nNum;
221     char *buf = (char *)malloc(byteSize);
222     memcpy_s(buf, byteSize, pwd, byteSize);
223 
224     for (int i = 0; i < byteSize; i++)
225     {
226         buf[i] ^= (i + nCount + g_nNum);
227     }
228     size_t rlen = fwrite(buf, sizeof(PASSWORD), g_nNum, pFile); // 密码数组
229     if (rlen != g_nNum)
230     {
231         printf("写入密码文件错误
");
232     }
233     else
234     {
235         printf("成功!!
");
236     }
237 
238     // 关闭文件
239     fclose(pFile);
240     free(buf);
241 }
242 
243 
244 
245 //从本地文件中读取密码,用于初始化密码本
246 void readInfo(PPASSWORD *ppPwd, int * pnCount)
247 {
248     // 打开文件
249     FILE *pFile;
250     errno_t err = fopen_s(&pFile, "data.i", "rb");
251     if (err != 0)
252     {
253         *ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD) * NUM);
254         g_nNum = NUM;
255         return;
256     }
257 
258     // 读写文件
259     // 先读取,再解密
260     fread(pnCount, sizeof(int), 1, pFile); // 当前密码个数
261     fread(&g_nNum, sizeof(g_nNum), 1, pFile); //当前密码本容量(个数)
262     *ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD) * g_nNum);
263     memset(*ppPwd, 0, sizeof(PASSWORD)*g_nNum);
264     size_t rlen = fread(*ppPwd, sizeof(PASSWORD), g_nNum, pFile); // 密码数组
265 
266     if (rlen != g_nNum)
267     {
268         printf("读取密码文件错误 
");
269         fclose(pFile);
270         return;
271     }
272 
273     // typedef unsigned int     size_t;
274 
275     int byteSize = sizeof(PASSWORD)*g_nNum;
276     char *buf = (char *)*ppPwd;
277     for (int i = 0; i < byteSize; i++)
278     {
279         buf[i] ^= (i + *pnCount + g_nNum);
280     }
281 
282     // 关闭文件
283     fclose(pFile);
284 }

运行结果如下:

原文地址:https://www.cnblogs.com/nothx/p/8532760.html