10.3 写入、追加与资源管理
写文件不只是“把文本放到某个地方”。你需要决定是新建文件、覆盖旧内容、追加到末尾、创建缺失文件夹,还是可靠地关闭资源。
写入小型文本文件
对于短文本,std::ofstream 是最直接的选择。
cpp
#include <fstream>
int main() {
std::ofstream output("study_log.txt");
output << "Today I learned std::filesystem::path.\n";
output << "std::ofstream writes text.\n";
output << "UTF-8 keeps text predictable.\n";
return 0;
}默认情况下,std::ofstream output("study_log.txt"); 会在需要时创建文件;如果文件已存在,则替换旧内容。这种替换行为适合生成全新报告,但如果你本来想保留旧数据,就很危险。
正在加载概念检查...
使用 open mode 追加
open mode 可以说明写入时应该发生什么。
cpp
#include <fstream>
int main() {
std::ofstream log("events.log", std::ios::app);
log << "Program started\n";
return 0;
}常见模式:
std::ios::out:输出模式。std::ios::trunc:写入前清空旧内容。std::ios::app:把新内容写到末尾。
模式很重要,因为文件输出可能破坏旧数据。覆盖还是追加,应该在代码里写清楚。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
缓冲、刷新与 RAII
多次小写入时,std::ofstream 高效且清晰。
cpp
std::ofstream writer("scores.csv");
writer << "Name,Score\n";
writer << "Alice,92\n";stream 通常会先缓冲数据,再发送到磁盘。关闭 stream 会刷新剩余数据。C++ 通过 RAII 处理这件事:stream 对象离开作用域时,它的析构函数会关闭文件。
你也可以在需要时手动刷新:
cpp
writer << "important line\n";
writer.flush();好习惯是把文件 stream 放在尽可能小的作用域中。作用域结束,stream 就会可靠关闭。
正在加载概念检查...
正在加载本节练习...