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, ¤t_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
相关产品推荐
相关产品推荐

