首页 > 解决方案 > 比较c linux fgets中的2个文件

问题描述

我需要比较 2 个文件,如果它们相同则返回 1,否则返回 0,但函数总是返回 0。我不知道为什么。也许你知道可以做到这一点的不同功能。

int compare(char *file_1, char *file_2)
{
    FILE *data_1 = fopen(file_1,"r");
    FILE *data_2 = fopen(file_2,"r");
    char line1[1000];
    char line2[1000];
    while(fgets(line1, sizeof(line1), data_1)&&fgets(line2, sizeof(line2), data_2)){
        if(strcmp(line1,line2)==0){
          fclose(data_1);
          fclose(data_2);
          return 0;
        }
    }
    fclose(data_1);
    fclose(data_2);
    return 1;
}

标签: clinux

解决方案


strcmp(line1,line2)==0表示line1line2相等,您的代码假设它们不同

还有一个错误,如果一个文件以另一个文件的内容开头,你认为文件是相等的(假设你更正了strcmp


我鼓励您检查fopen的结果,以防其中至少一个不存在/无法打开


解决方案可以是:

int compare(char *file_1, char *file_2)
{
  FILE *fp1 = fopen(file_1,"r");

  if (fp1 == 0)
    return 0;

  FILE *fp2 = fopen(file_2,"r");

  if (fp2 == 0) {
    fclose(fp1);
    return 0;
  }

  char line1[1000];
  char line2[1000];
  char * r1, * r2;
  int result;

  for (;;) {
    r1 = fgets(line1, sizeof(line1), fp1);
    r2 = fgets(line2, sizeof(line2), fp2);

    if ((r1 == 0) || (r2 == 0)) {
      result = (r1 == r2);
      break;
    }

    if (strcmp(line1,line2) != 0) {
      result = 0;
      break;
    }
  }

  fclose(fp1);
  fclose(fp2);

  return result;
}

推荐阅读