在C++工程开发中,日志记录是定位问题、监控程序运行状态的重要手段,使用标准库的ofstream类配合追加模式,可以高效实现日志文件的写入,且不会覆盖已有的日志内容。

ofstream追加模式基础用法
ofstream是C++标准库中用于输出文件流的类,位于fstream头文件中。要实现追加写入,需要在打开文件时指定std::ios::app模式,该模式会让新写入的内容自动追加到文件末尾,而不是清空原有内容。
基础的追加写入代码示例如下:
#include <fstream>
#include <iostream>
int main() {
// 打开日志文件,使用追加模式
std::ofstream logFile("app.log", std::ios::app);
// 判断文件是否成功打开
if (!logFile.is_open()) {
std::cerr << "日志文件打开失败" << std::endl;
return 1;
}
// 写入日志内容
logFile << "这是一条测试日志" << std::endl;
// 关闭文件流
logFile.close();
return 0;
}
工程级日志写入实现
实际工程中,日志通常需要包含时间戳、日志级别等信息,同时需要封装成可复用的函数,避免重复代码。下面是一个简单的工程级日志写入实现:
#include <fstream>
#include <iostream>
#include <chrono>
#include <ctime>
#include <string>
// 获取当前时间字符串
std::string getCurrentTime() {
auto now = std::chrono::system_clock::now();
std::time_t time = std::chrono::system_clock::to_time_t(now);
// 转换为本地时间
std::tm* localTime = std::localtime(&time);
char timeStr[64];
// 格式化时间:年-月-日 时:分:秒
std::strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", localTime);
return std::string(timeStr);
}
// 写入日志的封装函数
// 参数:logPath 日志文件路径,level 日志级别,content 日志内容
void writeLog(const std::string& logPath, const std::string& level, const std::string& content) {
std::ofstream logFile(logPath, std::ios::app);
if (!logFile.is_open()) {
std::cerr << "无法打开日志文件:" << logPath << std::endl;
return;
}
// 拼接日志内容:时间 [级别] 内容
logFile << "[" << getCurrentTime() << "] [" << level << "] " << content << std::endl;
logFile.close();
}
int main() {
// 测试不同级别的日志写入
writeLog("system.log", "INFO", "程序启动成功");
writeLog("system.log", "WARNING", "内存使用率超过70%");
writeLog("system.log", "ERROR", "数据库连接失败");
return 0;
}
注意事项
- 每次写入完成后建议主动调用
close()方法关闭文件流,避免文件句柄泄露,尤其是在长时间运行的程序中。 - 如果多个线程同时写入同一个日志文件,需要添加线程同步机制,比如使用互斥锁,避免日志内容错乱。
- 当日志文件过大时,可以增加日志轮转逻辑,比如按日期拆分日志文件,或者当文件大小超过阈值时创建新的日志文件。
- 打开文件时如果文件不存在,ofstream会自动创建新文件,无需额外判断文件是否存在。
常见问题解答
为什么写入的日志会覆盖原有内容
如果打开文件时没有指定std::ios::app模式,ofstream默认会以截断模式打开文件,清空原有内容再写入。只要确保打开时第二个参数包含std::ios::app即可解决该问题。
写入中文日志出现乱码怎么办
如果日志内容包含中文,需要确保源文件的编码和控制台、日志文件的编码一致,通常建议使用UTF-8编码,或者在写入时做对应的编码转换。
C++日志写入ofstream追加模式文件操作日志文件修改时间:2026-07-22 13:03:25