C语言如何保存fprintf输出的时间记录,重启时先打印旧记录再更新
实现方案
核心逻辑
- 固定使用本地文件
time_record.log作为持久化存储载体 - 程序启动时优先读取该文件内容并打印,即为上一次运行保存的旧时间记录,首次运行无该文件时可提示无历史记录
- 优化原有时间格式化逻辑,修复单数字字段前导空格问题,保证输出格式规整
- 生成最新时间后,除了原有输出到stderr的逻辑,同时将相同内容覆盖写入存储文件,完成更新
关键优化点
原有代码输出的时间存在单数字前带空格的问题,比如示例里的2021:11:5:11:20: 3,只需要把格式化符%2d替换为%02d即可自动补前导0,输出为2021:11:05:11:20:03的规范格式。另外冗长的月份switch判断可以直接用一行代码替代:sprintf(m, "%02d", month + 1);,效果完全一致。
完整可运行代码示例
#include <stdio.h> #include <time.h> #include <string.h> #define LOG_FILE "time_record.log" int main() { // 第一步:启动先读旧记录打印 FILE *fp_read = fopen(LOG_FILE, "r"); if (fp_read != NULL) { char buf[1024] = {0}; printf("===== 上一次运行保存的时间记录 =====\n"); while (fgets(buf, sizeof(buf), fp_read) != NULL) { printf("%s", buf); } fclose(fp_read); printf("==================================\n"); } else { printf("===== 首次运行,无历史时间记录 =====\n"); } // 原有时间获取逻辑,你自己的时间生成代码可以直接替换这部分 time_t t = time(NULL); struct tm *tm_info = localtime(&t); int year = tm_info->tm_year; int month = tm_info->tm_mon; int wd = tm_info->tm_mday; int hr = tm_info->tm_hour; int mn = tm_info->tm_min; int sc = tm_info->tm_sec; char m[3] = {0}; // 原有月份switch可替换为更简洁的写法,保留原switch功能也完全不受影响 sprintf(m, "%02d", month + 1); year = year + 1900; // 原有输出到stderr的逻辑保留 fprintf(stderr, "Time Logout (YYYY:MM:DD:HH:MM:SS):\n%d:%s:%02d:%02d:%02d:%02d\n", year, m, wd, hr, mn, sc); // 第二步:最新时间写入持久化文件 FILE *fp_write = fopen(LOG_FILE, "w"); if (fp_write != NULL) { fprintf(fp_write, "Time Logout (YYYY:MM:DD:HH:MM:SS):\n%d:%s:%02d:%02d:%02d:%02d\n", year, m, wd, hr, mn, sc); fclose(fp_write); } return 0; }
运行说明
- 首次运行时会提示无历史记录,同时生成
time_record.log文件保存本次时间 - 后续每次运行都会先打印上一次保存在文件里的时间,再输出本次最新时间同时更新文件
- 如果需要保存多轮历史记录而不是只保留上一次,把打开文件的模式从
w改成a追加模式即可
内容的提问来源于stack exchange,提问作者NewGuy
相关产品推荐
相关产品推荐

