用 std::vector 存待办事项最稳妥:push_back 追加、erase 删除、size() 获取数量,自动管理内存;常见错误是下标访问前未检查 index >= 0 && index
怎么用
std::vector存待办事项,而不是手动管理数组直接用裸数组写增删改查,很快会崩溃——比如删第 2 条后忘了把后面所有元素前移,或者插入时越界。用
std::vector是最稳妥的起点:push_back追加、erase删除指定位置、size()获取数量,全部自动处理内存。常见错误:用下标访问前不检查
index >= 0 && index ,一输错序号就 <code>std::out_of_range或静默越界(开启-D_GLIBCXX_DEBUG编译可捕获)。
- 每条任务建议定义为结构体,比如
struct Task { std::string desc; bool done; };- 别用
vector<task></task>,除非真需要多态或延迟构造;堆分配增加复杂度,且容易忘记delete- 如果后续要按状态筛选,
std::vector比std::list更适合遍历——现代 CPU 对连续内存更友好怎么让命令解析不依赖第三方库(如
argparse)命令行工具不需要一开始就支持
--help --verbose -f file.txt这种复杂语法。从最简模式起步:第一参数是动作(add/list/done),其余是参数。典型坑:用户输入
./todo done不带序号,程序直接访问argv[2]会读到未初始化内存(argc == 2时argv[2]为空指针)。必须先检查argc。
if (argcstd::string action = argv[1];后用if (action == "add") { ... }分支,别用strcmp—— C++ 字符串比较更安全- 数字参数(如
done 3)要用std::stoi(argv[2]),但得包在try/catch里——用户输字母会抛std::invalid_argument怎么保存数据到文件,避免重启就丢任务
每次启动时从
tasks.txt读,退出前写回。别用二进制序列化(跨平台/编译器易出问题),纯文本最可靠。格式选简单易读的:一行一条任务,
done或pending开头,后面跟描述。例如:done Buy milk pending Call mom pending Fix bug #123读取时用
std::getline逐行,用substr(0, 5) == "done "判断状态;保存时用ofstream覆盖写入(不是追加),否则重复运行会累积旧数据。
- 写文件失败不报错是最大隐患——务必检查
if (!file.is_open())和if (!file.good())- 不要在
add命令后立刻写盘——频繁 IO 影响响应,统一在程序退出前保存一次即可- 路径别硬编码,用
"./tasks.txt"而不是"/home/user/tasks.txt",否则 Windows 用户直接卡住为什么不用
system("clear")清屏,而用 ANSI 转义序列
system("clear")或system("cls")看似方便,但实际破坏性极强:它会 fork 新进程、调用 shell、依赖系统命令存在。交叉编译到嵌入式环境或 Alpine Linux 时直接失败。真正轻量且跨平台的做法,是输出
\033[2J\033[H(ESC[2J 清屏,ESC[H 回顶部)。Windows 10+ 和所有主流终端都支持,且无外部依赖。实际写出来不到 200 行就能跑通核心流程,难点不在语法,而在边界处理:空输入、文件不可写、序号超出范围、UTF-8 描述含空格……这些地方不加 guard,用户第一次用就会觉得“这工具不靠谱”。
- 封装成函数:
void clear_screen() { std::cout- 注意:这仅控制终端显示,不影响数据逻辑——清屏只是提升交互体验,不是功能必需
- 如果目标平台明确不支持 ANSI(如某些旧 DOS 终端),才考虑条件编译 +
system,但绝大多数现代场景无需妥协
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












