讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么在写入文件时根据当前日期自动生成不冲突的日志文件名【实战】

陌静君_9514

陌静君_9514

发布时间:2026-03-30 20:13:01

|

228人浏览过

|

来源于php中文网

原创

推荐用 std::chrono 获取时间点再用 std::put_time 格式化生成文件名,可自动补零、适配 locale;避免 std::localtime 多线程不安全;格式建议 "%Y%m%d_%H%M%S"。

c++怎么在写入文件时根据当前日期自动生成不冲突的日志文件名【实战】

用 std::chrono 和 std::put_time 生成带日期的文件名

直接拼字符串容易出错,比如月份/日期少一位、时区错乱、格式不一致。C++11 起推荐用 std::chrono 获取当前时间点,再用 std::put_time 格式化——它能自动补零、适配 locale,比手撕 strftime 更稳。

  • 别用 std::time(nullptr) 配 std::localtime:多线程下 localtime 返回静态缓冲区指针,可能被覆盖
  • 格式串建议用 "%Y%m%d_%H%M%S",避免斜杠、冒号(Windows 不允许),也避开空格(shell 处理麻烦)
  • 示例:
    auto now = std::chrono::system_clock::now();
    auto time_t = std::chrono::system_clock::to_time_t(now);
    std::stringstream ss;
    ss << std::put_time(std::localtime(&time_t), "%Y%m%d_%H%M%S");
    std::string filename = "log_" + ss.str() + ".txt";

加序号防同秒冲突,而不是靠毫秒

日志高频写入时,哪怕同一秒内也可能生成多个文件。想靠毫秒(std::chrono::milliseconds)补在文件名里?不现实——std::system_clock::now() 的实际精度因平台而异,Windows 下常是 15ms,Linux 可能 1–10ms,且无法保证单调递增。

  • 更可靠的做法:同一秒内首次生成用基础名,后续用 log_20240615_142305_1.txt 这种带序号的变体
  • 用一个 static std::map<:string int></:string> 缓存“已生成的秒级时间戳 → 当前序号”,每次生成前查表+自增
  • 注意线程安全:如果多线程同时调用,得用 std::mutex 锁住这个 map 操作,否则序号会跳或重复

检查文件是否存在再决定是否加序号

光靠时间戳+序号还不够。万一程序崩溃重启,上一秒生成的文件还躺在磁盘里,新进程又从序号 1 开始,就会覆盖旧日志。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 生成文件名后,必须调用 std::filesystem::exists(filename)(C++17)或 access(filename.c_str(), F_OK)(POSIX)确认文件未存在
  • 只在 exists() 返回 true 时才触发序号逻辑,否则直接用基础名
  • 别省略这步:有些项目图省事只靠时间戳,结果凌晨服务自动拉起时,和前一天末尾的日志撞名,丢数据

Windows 下注意长路径和保留字

生成的文件名最终要能被系统接受。Windows 对路径长度、非法字符、设备名保留字极其敏感,而开发者常在 Linux/macOS 上测试,上线才踩坑。

立即学习“C++免费学习笔记(深入)”;

  • 路径总长别超 MAX_PATH(默认 260 字符),尤其当基础路径本身很长时,日期+序号+扩展名容易溢出
  • 文件名里禁用 , :, ", /, \, |, ?, *,std::put_time 默认不产生这些,但自己拼前缀/后缀时要过滤
  • 别用 CON、AUX、NUL 等作前缀——比如 CON_20240615.txt 在 Windows 下根本创建失败,错误是 "The system cannot find the file specified.",非常误导
实际最难处理的是并发写入与文件系统延迟之间的博弈:你检查了文件不存在,正准备创建,另一线程瞬间完成同名创建,你的 std::ofstream 构造就会静默失败(除非显式检查 is_open())。这事没法靠命名完全规避,得配合原子性写入策略。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1858

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2964

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6244

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6189

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7754

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11774

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

6079

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6727

2025.08.07

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn