C语言使用命令行参数合并数据文件的代码错误排查
C代码错误排查与修正
以下是这段合并文件代码中的错误及对应修正方案:
fprintf参数传递错误:
在mergeFiles函数中,fprintf的%d格式符需要接收int类型的值,但代码中传递的是num的地址(&num),这会导致输出内存地址而非读取到的数值。
修正:将两处fprintf中的&num改为num,同时统一换行格式保证输出内容一致:fprintf(file3,"%d\n", num);函数调用语法错误:
main函数中调用合并函数时,错误地将函数名mergeFiles拆成了merge files,会导致编译报错。
修正:改为正确的函数名调用:mergeFiles(file1, file2, file3);fprintf参数缺失:
错误处理代码中,fprintf("Error Opening files\n");缺少目标文件指针参数,标准错误输出应使用stderr。
修正:改为:fprintf(stderr, "Error Opening files\n");用法提示格式不规范:
原提示中的参数与程序名无空格分隔,且第三个参数描述错误(应为输出文件),用户难以理解正确命令格式。
修正:调整提示文本:printf("Usage : %s <data1> <data2> <output-file>\n", argv[0]);
修正后的完整代码
#include<stdio.h> #include<stdlib.h> void mergeFiles(FILE *file1, FILE *file2, FILE *file3) { int num; while(fscanf(file1,"%d", &num) != EOF) { fprintf(file3,"%d\n", num); } while(fscanf(file2,"%d", &num) != EOF) { fprintf(file3,"%d\n", num); } } int main(int argc, char *argv[]){ if(argc != 4) { printf("Usage : %s <data1> <data2> <output-file>\n", argv[0]); return 1; } FILE *file1 = fopen(argv[1], "r"); FILE *file2 = fopen(argv[2], "r"); FILE *file3 = fopen(argv[3], "w"); if(file1 == NULL || file2 == NULL || file3 == NULL){ fprintf(stderr, "Error Opening files\n"); // 打开失败时关闭已成功打开的文件,避免资源泄漏 if(file1) fclose(file1); if(file2) fclose(file2); if(file3) fclose(file3); return 1; } mergeFiles(file1, file2, file3); printf("Merged content written to %s\n", argv[3]); fclose(file1); fclose(file2); fclose(file3); return 0; }
额外优化:在文件打开失败时,关闭已经成功打开的文件,避免资源泄漏。
内容的提问来源于stack exchange,提问作者PRACHI
相关产品推荐
相关产品推荐

