|
附 deepseek生成版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// 计算整数位数 (0 返回长度1)
unsigned int calc_num_length(unsigned int a) {
if (a == 0) return 1;
unsigned int length = 0;
while (a > 0) {
length++;
a /= 10;
}
return length;
}
// 智能文件名生成器
char* generate_filename(const char* prefix, unsigned int num,
const char* suffix, unsigned int max_len) {
// 最大尝试长度 = 最大位数+1(应对意外情况)
const unsigned int MAX_TRIES = 2;
static char buffer[1024]; // 静态缓冲区避免重复分配
// 尝试不同格式:补零格式 > 原始格式
unsigned int lengths[] = {max_len, calc_num_length(num)};
for (int i = 0; i < MAX_TRIES; i++) {
char num_str[32] = {0};
unsigned int len = lengths[i];
// 数字部分生成(带前导零)
for (int pos = len - 1; pos >= 0; pos--) {
num_str[pos] = '0' + (num % 10);
num /= 10;
}
// 组合完整文件名
snprintf(buffer, sizeof(buffer), "%s%s%s", prefix, num_str, suffix);
// 检查文件是否存在(优化点:可跳过检查直接尝试打开)
FILE* test = fopen(buffer, "rb");
if (test) {
fclose(test);
return buffer;
}
}
return NULL; // 所有格式尝试失败
}
int main(int argc, char* argv[]) {
if (argc != 7) {
printf("Usage: %s Prefix Suffix start stop step OutFile\n", argv[0]);
return 1;
}
// 参数解析
const char* prefix = argv[1];
const char* suffix = argv[2];
unsigned int start = atoi(argv[3]);
unsigned int stop = atoi(argv[4]);
unsigned int step = atoi(argv[5]);
const char* outfile = argv[6];
// 计算最大数字位数(用于补零)
unsigned int max_len = calc_num_length(stop > 1 ? stop - 1 : stop);
// 预计算缓冲区大小
size_t buf_size = 64 * 1024; // 64KB缓冲区
char* buffer = malloc(buf_size);
if (!buffer) {
perror("Memory allocation failed");
return 1;
}
// 统一打开输出文件
FILE* out_fp = fopen(outfile, "ab"); // 二进制追加模式
if (!out_fp) {
perror("Failed to open output file");
free(buffer);
return 1;
}
// 主处理循环
for (unsigned int num = start; num < stop; num += step) {
// 生成智能文件名
char* filename = generate_filename(prefix, num, suffix, max_len);
if (!filename) {
fprintf(stderr, "File not found for number %u\n", num);
continue;
}
// 打开输入文件
FILE* in_fp = fopen(filename, "rb");
if (!in_fp) {
perror("Failed to open input file");
continue;
}
// 大块数据复制
size_t bytes_read;
while ((bytes_read = fread(buffer, 1, buf_size, in_fp)) {
size_t bytes_written = fwrite(buffer, 1, bytes_read, out_fp);
if (bytes_written != bytes_read) {
perror("Write error");
break;
}
}
// 关闭当前输入文件
fclose(in_fp);
}
// 清理资源
fclose(out_fp);
free(buffer);
printf("Files merged successfully\n");
return 0;
}
|
|