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;
}
問題は、後で2つのファイルを比較して、ファイルの行が一致しないときに意味のある出力を提供したいということです。これが私がそのために書いたコードです:
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ポインターを2回インクリメントしたため、argvは2番目のコマンドライン引数から開始するようになりました。*argv--
ファイルを開いてから2行実行する以外に、この動作をリセットする良い方法はありますか?