尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

《写一个 C++ 命令行记账本总结与反思》

《写一个 C++ 命令行记账本总结与反思》 一.引入我现在写的这个命令行记账本是一个非常基础非常小的项目我写这个项目的主要目的是在我写迷你数据库的项目之前对我的技术栈进行热身和完善虽然项目不大但是也踩了不少坑涉及到的技术栈有c17、STL库、文件流fstream二.项目功能写了四个菜单功能分别是退出程序、记一笔账存储格式一行一笔账\t分隔查流水、按类别统计展示如下持久化保存的文件里现有的内容运行过程如下持久化保存的文件里经过如上的内容三、坑坑原因解决方式1.cin 和 getline 混用备注被吃了残留换行符用cin.ignore()把输入缓冲区里残留的换行符冲掉2.空 vector 用 v[0]程序崩溃未定义行为3.往菜单选项里输入字母程序卡死原本while(true),cin 读取失败后陷入失败状态且未恢复循环条件永真改用while(cinx)当循环条件读取失败自动退出循环4.double类型数据自己四舍五入并且保留位数还不同double 默认 6 位有效数字不是 6 位小数利用fixedsetprecision(2)5.0.10.2≠0.3二进制存不下十进制小数银行用整数分6.中文乱码大战UTF-8 vs GBK 密码本chcp 失败ConPTY传话人当发现文件编码和chcp已经改成UTF-8但显示还是乱码这个问题最后我是借助ai辅助解决的系统级 UTF-8 根治7.文件格式契约字段顺序错位前 3 格按格拆尾部全部归备注因为前三个字段固定、备注允许任意内容8.把金额改成 abc程序当场暴毙stod 抛异常try-catch 接住坏行跳过这里我再重点把坑4、6、8给详细描述一下坑4的发现是我在给记一笔这个选项增加持久化保存功能时发现的超过 6 位有效数字的小数会被四舍五入到 6 位有效数字这就导致不同数字的小数点后几位保留的位数都不一致为了让这些小数统一保留到小数点后两位我经过资料查阅利用fixedsetprecision(2)解决了问题坑6的乱码问题出现的时候我一开始以为是我文件的编码和终端编码不一致导致的于是我修改了文件的编码和终端(chcp)的编码统一为UTF-8但是还是乱码问题。最终经过一些时间的努力我没有头绪就借助Claude Code把问题定位到我用的集成工具vscode和终端的中间“传话人”ConPTY上最后我直接把后台系统的编码改成UTF-8这个问题就解决了坑8的问题其实是很常见的问题具体类型是std::invalid_argument参数不合法为了避免“一粒老鼠屎坏了一锅粥”的问题直接利用try-catch就可以轻松避免这个问题四、总结利用这个项目帮我温故而知新一些新知识包括智能指针、RAII以及简单的try-catch异常处理并且对于以前出现过以及新出现的bug有了经验在以后再次出现的时候可以更高效更准确地解决问题。但是毫无疑问的是这个小项目在使用过程中存在一些瓶颈如下启动慢文本格式逐行解析是主因 → 换二进制格式直接 memcpy 结构体快一个数量级或建索引文件查流水慢printAll 10 万行全打印瓶颈在屏幕 IO →分页显示查某天/某类别的账现在没有索引得 O(n) 扫 → 加索引或排序如果数据量再大一个数量级单文件就不够了——这时候就需要一个真正的数据库了。下一步从零写一个迷你 SQL 数据库。这个记账本暴露的问题——单文件全量加载、没有索引——正是数据库要解决的问题。
返回列表