我有一个基于char ** argv命令行参数打开文件的程序。这是逻辑:
char * openErrorString = "Error opening file: ";
FILE *fp1 = fopen(*++argv, "r");
if (fp1 == NULL) {
perror(openErrorString);
return 1;
}
FILE *fp2 = fopen(*++argv, "r");
if (fp2 == NULL) {
perror(openErrorString);
return 1;
}
问题是,我后来想要比较两个文件,并在文件中的行不匹配时给出有意义的输出。这是我为此写的代码:
while (fgets(fp1Line, max, fp1) != NULL &&
fgets(fp2Line, max, fp2) != NULL) {
if (strcmp(fp1Line, fp2Line)) {
printf("%s\n","Line discrepancy found:");
printf("%s: %s\n", argv[1], fp1Line);
printf("%s: %s\n", argv[2], fp2Line);
fclose(fp1);
fclose(fp2);
return 0;
}
}
但是,当我在argv[1]
语句中调用printf
时,我得到(null),即argv中的最后一个条目。当我致电argv[2]
时,我会得到TERM_PROGRAM=Apple_Terminal
。我不知道那是什么。似乎正在发生的是因为我在访问它时打开文件时两次递增argv指针,现在argv从第二个命令行参数开始。除了在打开文件后执行两行*argv--
之外,还有一种重置此行为的好方法吗?
答案 0 :(得分:4)
我的建议是不要修改argv
。将指针复制到另一个变量中,然后递增。通过这种方式,您可以反复使用argv
,而不用担心它现在指向的位置。
答案 1 :(得分:3)
只是不要增加argv,例如:
FILE *fp1 = fopen(argv[0], "r");
// ...
FILE *fp2 = fopen(argv[1], "r");
答案 2 :(得分:2)
如果再次需要,没有理由更改argv指针。相反,替换
FILE *fp1 = fopen(*++argv, "r");
通过
FILE *fp1 = fopen(argv[1], "r");
和
FILE *fp2 = fopen(*++argv, "r");
通过
FILE *fp2 = fopen(argv[2], "r");