> # ♻️ 资源
> **大小:** 3.39MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010428**](https://www.yuque.com/sxbn/ks/100010428)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87388340**](https://download.csdn.net/download/s1t16/87388340)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 社交应用的数据存储与实现
## 概述
本文介绍根据《大作业:社交应用的数据存储与实现》一文中所提要求设计的程序,该程序为 32 位 Windows 控制台程序,用 C++ 写成,用 VS 编译,因调用了 WinAPI 不具备可移植性。截至目前该程序实现了《大作业》文中的所有基本要求以及除关注推荐和折叠消息以外的所有扩展要求,此外还实现了一个简易的输入框(详见下文)。
## 整体架构
![17bb3ba3242e6e2cf8acf398e63a27ea.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711416818073-4abcdee8-8fcf-43b8-b9a3-1c9a38e34095.png#averageHue=%23ebedef&clientId=u3e9a6ca5-999f-4&from=paste&height=2102&id=u67b23311&originHeight=2627&originWidth=3554&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=564796&status=done&style=none&taskId=u6c1ddd3e-a341-49e5-80e9-33e05d5d3fb&title=&width=2843.2)
按照《大作业》文中的需求,程序主要分为前台与后台两大模块,分别由 Application 类与 UserDataBaseManager 类实现,前台负责交互,后台负责处理数据,另置一些辅助的结构与类,如图所示。
## 前台交互
前台的 Application 类提供一 public 方法 exec(),其结构大致如下:
```c
while(true) {
try {
switch(state) {
...
case LOGIN:
login_work();
break;
...
default:
break;
}
}
catch (runtime_error &e) {
system(“cls”);
}
}
```
其中 state 是前台类的枚举类型私有成员,即前台类与用户的交互类似于有限状态自动机,根据用户的输入决定是否进行状态转移以转移到何种状态。前台交互的逻辑如图:
![b8322646c8823cae8325932ddd2308ac.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711416835631-e7dba61e-f363-4eb8-966e-841866b7f39b.png#averageHue=%23f7f7f7&clientId=u3e9a6ca5-999f-4&from=paste&height=2071&id=u0865d5eb&originHeight=2589&originWidth=6835&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=936967&status=done&style=none&taskId=u098f280c-b9eb-46d2-9b24-92029889872&title=&width=5468)
(详见状态转移图.png)
图中用大写英文字母和下划线组成的名称为 state 可取的枚举值,也即显式的状态,此外一些简单的工作(图中用中文表示),则不设专门的状态,直接在上层状态的处理函数中完成。图中的 Ctrl-C 指在接受输入(陷入输入调用)的过程中,按 Ctrl-C 可以跳出目前的输入状态回到上层菜单。此外从 OTHER_USER_MAIN_MENU,DELETE_MENU,FORWARD_MENU 等状态返回上级菜单时,不仅与用户输入(选择返回上层菜单)有关,还与之前从哪个上层状态进入有关,这一点与有限状态自动机是不同的,因此本程序只能说是参考了自动机的思想,并不是严格按照自动机的状态转移编写的。
值得一提的是,为了在控制台程序的限制下给出简洁、优美的用户界面,专门编写了一些组织输入输出的代码,包括以下几点:
- 使用户输入的密码显示为“*”号的辅助函数 get_password_help()
- 显示一组用户时提供可以按左右键翻页,输入序号选择用户的界面的辅助函数 list_user_set(SetVisitor &user_set)
发送消息、转发消息时提供与 GUI 类似的输入界面,能够做到上下左右移动光标(标准库提供的接口无法上下移动光标),在转发消息时能将被转发的消息(该消息转发自他人)读入,并允许用户在该输入界面修改消息(就像真正的微博的转发功能那样),同时具备统计字数功能,用户已经输入的字数在右上角实时更新,达到或超过 140 字时不允许继续输入。编写了 MessageEditor 类实现该功能。
后台存储
- 数据文件
一共使用四个文件,分别为 user.idx(用户索引),user.dat(用户信息),user.rel(用户间关注关系),user.msg(用户所发消息)。使用 C++ 标准库的文件流操作文件,在类初始化时打开文件,程序退出时关闭文件,程序运行途中由前台调用后台执行某事务时,在事务执行的最后调用 fstream 的 flush 方法将数据写入硬盘,既保证了内存与文件数据的一致性,又不至于每次调用 write 方法都 flush 而造成不必要的大量硬盘读写操作。
- 数据结构
用户信息及其索引
用户的各项信息在设置时都有长度限制,存储在 user.dat 文件中,某用户的个人信息体现为一条定长的记录,用户记录一旦插入文件永不删除,删除用户时只对该记录做一标记以表示其已被删除,不可用于注册新用户,整个文件的结构为一系列用户记录按照用户注册的先后顺序依次排列,构成文件。用户记录如下所示:
```c
User:
UserName 16 Bytes
Password 32 Bytes
Name 24 Bytes
{ Gender [1] 8 Bytes
{ Deleted[2]
{ Phone[3-8]
Birthday 4 Bytes
Hometown 24 Bytes
InEdges 8 Bytes
OutEdges 8 Bytes
Message 8 Bytes
InCount 4 Bytes
OutCount 4 Bytes
MessageCount 4 Bytes
```
总计 144 字节
其中,电话号码采用 64 位整数存放,由于电话号码即使算上区号也无法占满 64 位的整数,因此在前台限制了用户最多输入 14 位的电话号码,从而利用其最高及次高字节来存储性别以及是否已被删除;InEdges,OutEdges 指向关注链表,Message 指向消息链表,Incount,OutCount,MessageCount 分别为粉丝计数、关注计数与消息计数,详见关注与消息的介绍部分。
由于用户信息在 user.dat 文件中并没有任何有效的组织形式,为了快速找到某用户在 user.dat 中的位置,还建立了 user.idx 文件作为索引。在该索引文件内存储了一棵 171 阶 B+ 树,Block 大小为 4096 字节,其根节点总是位于该文件内的第一个 Block。通过测试可以发现,VS 实现的 C++ 标准库在进行文件读写时,是以 4096 字节为单位进行读写的,此外 Windows 下 NTFS 文件系统默认的簇大小也是 4096 字节,因此以此作为参考,我将 B+ 树的 Block 大小选定为了 4096 字节,以期与操作系统及标准库的 buffer 形成最好的配合。
### 用户间的关注关系
用户之间的关注关系可以抽象成一个有向图,图中节点代表用户,边代表用户之间的关注关系,一条有向边 a->b 即表示用户 a 关注用户 b。由于注意到这一点,我采用(双向)十字链表来表示用户关注关系,如图所示(图片来自互联网,描述的为单向十字链表,我采用的是双向十字链表,在删除时更方便):
![c4c4d3f9522068fee6473bdd092bc6fa.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711416866938-0ba9aa0e-fb10-47cf-8227-646859b597af.png#averageHue=%23f2f2f2&clientId=u3e9a6ca5-999f-4&from=paste&height=245&id=u0016b0ae&originHeight=306&originWidth=713&originalType=binary&ratio=1.25&rotation=0&s
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010428 本文介绍根据《大作业:社交应用的数据存储与实现》一文中所提要求设计的程序,该程序为 32 位 Windows 控制台程序,用 C++ 写成,用 VS 编译,因调用了 WinAPI 不具备可移植性。截至目前该程序实现了《大作业》文中的所有基本要求以及除关注推荐和折叠消息以外的所有扩展要求,此外还实现了一个简易的输入框。
资源推荐
资源详情
资源评论
收起资源包目录
100010428-基于C++实现社交应用的数据存储.zip (31个子文件)
winapi
regist2.png 86KB
search2.png 98KB
LICENSE 1KB
状态转移图.png 915KB
软件架构.png 552KB
follow.png 91KB
search1.png 74KB
SE106_Project
SE106_Project.v12.suo 82KB
SE106_Project
stdafx.h 219B
SE106_Project.vcxproj 5KB
user.cpp 6KB
btree_node.h 1KB
user_database_manager.cpp 38KB
user.h 2KB
special_iterator.h 1KB
message_editor.cpp 20KB
btree_node.cpp 7KB
main.cpp 242B
user_database_manager.h 4KB
application.cpp 53KB
ReadMe.txt 1KB
set_visitor.h 729B
message_editor.h 1018B
application.h 3KB
SE106_Project.vcxproj.filters 2KB
stdafx.cpp 211B
targetver.h 228B
SE106_Project.sln 963B
说明文档.doc 2.02MB
regist1.png 78KB
README.md 25KB
共 31 条
- 1
资源评论
神仙别闹
- 粉丝: 2712
- 资源: 7668
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功