You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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(&current_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:50:55