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

C语言中如何读取前缀为info、后缀为mmdd格式的多个文件?

嘿,我明白你遇到的坑了!直接用循环变量i去拼文件名的话,肯定会出现像0230、1350这种根本不存在的日期,导致fopen失败,程序直接崩掉对吧?别担心,我给你一套靠谱的解决方案,分分钟搞定这个问题!

解决思路与代码实现

1. 核心问题拆解

你之前的问题出在用连续整数生成日期后缀,但四位mmdd必须是合法的月份+日期组合:

  • 月份得是01-12的两位数字
  • 日期要匹配对应月份的实际天数(还要考虑闰年2月的29日)

所以正确的姿势是按月份遍历,再在每个月里遍历合法的日期,这样生成的文件名全是有效的。

2. 完整可运行的C代码

下面是包含日期合法性判断、文件读取、数据存储和计算的完整代码,你可以直接根据自己的数据格式调整:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 判断是否为闰年(处理2月29日的情况)
int is_leap_year(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return 1;
    }
    return 0;
}

// 获取指定月份的天数
int get_days_in_month(int month, int year) {
    // 非闰年各月天数
    int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    // 闰年2月多一天
    if (month == 2 && is_leap_year(year)) {
        return 29;
    }
    return days[month - 1];
}

// 读取文件数据到数组(这里假设每行是整数,可根据你的数据格式修改)
int read_file_data(const char *filename, int *data_array, int max_available, int *read_count) {
    FILE *fp = fopen(filename, "r");
    if (!fp) {
        printf("⚠️ 无法打开文件: %s\n", filename);
        return -1;
    }

    *read_count = 0;
    int num;
    // 循环读取数据,避免数组越界
    while (fscanf(fp, "%d", &num) != EOF && *read_count < max_available) {
        data_array[(*read_count)++] = num;
    }

    fclose(fp);
    return 0;
}

int main() {
    // 替换成你需要处理的年份
    int target_year = 2024;
    // 定义存储数据的数组,根据实际需求调整大小
    int data_array[10000];
    int total_data = 0;
    int array_max_size = sizeof(data_array) / sizeof(data_array[0]);

    // 遍历1-12月
    for (int month = 1; month <= 12; month++) {
        int days_in_month = get_days_in_month(month, target_year);
        // 遍历当月的每一天
        for (int day = 1; day <= days_in_month; day++) {
            char filename[20];
            // 格式化生成文件名:用%02d保证两位数字,自动补前导零
            sprintf(filename, "info%02d%02d.txt", month, day);
            
            int current_read;
            if (read_file_data(filename, data_array + total_data, array_max_size - total_data, &current_read) == 0) {
                total_data += current_read;
                printf("✅ 成功读取文件: %s,新增%d条数据\n", filename, current_read);
            }
        }
    }

    // ------------------- 这里添加你的数据计算逻辑 -------------------
    printf("\n📊 所有文件读取完成,共获取%d条数据\n", total_data);
    
    // 示例:计算数据总和
    int sum = 0;
    for (int i = 0; i < total_data; i++) {
        sum += data_array[i];
    }
    printf("数据总和为: %d\n", sum);
    // -------------------------------------------------------------

    return 0;
}

3. 关键细节说明

  • 合法文件名生成:用%02d格式化月份和日期,确保生成的是两位数字(比如9月会变成09,1日变成01),完美匹配infoMMDD.txt的格式。
  • 容错处理:即使某个日期的文件不存在,程序只会打印提示,不会崩溃,继续处理其他文件。
  • 数组安全:用total_data跟踪已存储的数据量,每次读取时计算剩余空间,避免数组越界。
  • 闰年适配:如果你的文件包含闰年2月29日,代码会自动识别并处理。

4. 扩展:处理多年的文件

如果需要覆盖多个年份的文件,只需要在外层加一个年份循环即可:

// 处理2020到2024年的文件
for (int year = 2020; year <= 2024; year++) {
    // 里面的月份和日期循环不变,把target_year换成当前year
    int days_in_month = get_days_in_month(month, year);
    // ... 其余逻辑一致
}

内容的提问来源于stack exchange,提问作者JC234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:28:15