0

我有一个基于 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--除了在打开文件后执行两行之外,是否有一种重置此行为的好方法?

4

3 回答 3

4

我的建议是不要修改argv. 将指针复制到另一个变量中,然后增加它。这样,您可以argv一次又一次地使用,而不必担心它现在指向的位置。

于 2013-03-11T14:29:00.013 回答
3

只是不要增加 argv,例如:

FILE *fp1 = fopen(argv[0], "r");
// ...
FILE *fp2 = fopen(argv[1], "r");
于 2013-03-11T14:29:33.867 回答
2

如果您再次需要,没有理由更改 argv 指针。相反,更换

FILE *fp1 = fopen(*++argv, "r");

经过

FILE *fp1 = fopen(argv[1], "r");

FILE *fp2 = fopen(*++argv, "r");

经过

FILE *fp2 = fopen(argv[2], "r");
于 2013-03-11T14:30:23.860 回答