如何在C语言中实现程序多次运行时文件写入不覆盖数据
解决C语言写入文件覆盖历史记录的问题
嘿,这个需求太贴合训练记录的场景了!我之前帮朋友做过类似的健身训练日志工具,刚好能给你支招。
问题根源
你现在的程序用fopen打开文件时用的是"w"(写入模式),这个模式的行为是:如果文件存在就清空所有内容,再写入新数据;如果不存在就创建新文件——这就是为什么每次运行都会覆盖之前的闭气时长记录。
解决方案:改用追加模式
只需要把文件打开模式改成"a"或者"a+",就能实现末尾追加内容的效果:
"a":纯追加写入模式,新内容会自动加到文件最后,只能写不能读"a+":追加+可读模式,如果你之后需要读取历史记录做统计,可以用这个
示例代码(带实用优化)
我给你写了一段优化后的代码,不仅解决了覆盖问题,还加了时间戳——毕竟要跟踪一周、一月的训练进度,知道每次记录的时间比单纯的秒数有用多了:
#include <stdio.h> #include <time.h> int main() { // 这里替换成你的实际计时结果 int hold_seconds = 22; // 关键:把"w"改成"a",开启追加模式 FILE *fp = fopen("breath_hold_log.txt", "a"); if (fp == NULL) { perror("打开记录文件失败"); return 1; } // 获取当前时间,生成时间戳 time_t current_time = time(NULL); struct tm *local_tm = localtime(¤t_time); // 写入格式化的记录:日期时间 + 闭气时长 fprintf(fp, "%04d-%02d-%02d %02d:%02d:%02d | 闭气时长:%d秒\n", local_tm->tm_year + 1900, // 年份要加1900,因为tm_year是从1900开始算的 local_tm->tm_mon + 1, // 月份从0开始,所以加1 local_tm->tm_mday, local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec, hold_seconds); // 一定要关闭文件,确保数据写入磁盘 fclose(fp); printf("训练记录已成功追加!\n"); return 0; }
额外提示
- 用
"a"模式时,如果目标文件不存在,程序会自动创建它,不用你手动建文件 - 每次操作完文件务必调用
fclose(),避免因为程序意外退出导致数据丢失 - 如果之后需要统计历史数据,比如计算平均时长、最长时长,可以用
"a+"模式打开文件,然后读取内容做分析
内容的提问来源于stack exchange,提问作者user8340568
相关产品推荐
相关产品推荐

