首页 > 解决方案 > 如何检查两个文件的内容是否相同?

问题描述

我需要检查两个文件的内容是否相同,我的意思是每个文件中的字符串是否彼此相等。我用c语言编写了一个程序,如果文件相同,则返回2,否则返回1。我的问题是无论内容是什么,该函数都保持返回1。

#include <stdio.h> 

int compareFilles(FILE *fp1, FILE *fp2){

  int word1 = getc(fp1); 
  int word2 = getc(fp2);

  //A loop until the end of the files(EOF)
  while (word1 =! EOF && word2 != EOF && word1 == word2){
    word1 = getc(fp1); 
    word2 = getc(fp2);
  }

  if (word1 != word2){
     return 1;
   }else{
        return 2;
    }
}

int main(int argc, char* argv[]){
  FILE *fp1 = fopen(argv[0], "r");
  FILE *fp2 = fopen(argv[1], "r");

  printf("%d", compareFilles(fp1, fp2));

  //closing the files
  fclose(fp1); 
  fclose(fp2);

  return 0;
}

标签: c

解决方案


#include <stdio.h> 

int compareFilles(FILE *fp1, FILE *fp2){

此函数应返回 a bool,因为它是表达true/false值的自然数据类型。

  int word1 = getc(fp1); 
  int word2 = getc(fp2);

变量名错误。该getc函数不读取一个字,它只从文件中读取一个字节。

  //A loop until the end of the files(EOF)
  while (word1 =! EOF && word2 != EOF && word1 == word2){

正如其中一条评论中所说,这=!意味着“分配否定”而不是您的意思的“不平等”。为避免将来发生此类错误,请始终让自动代码格式化程序在将代码保存到磁盘之前对其进行格式化。然后该代码将显示为word1 = !EOF,这应该引起足够的关注。这样做还可以保护您免受著名的goto fail错误的影响,这意味着您将拥有比 Apple 更好的编程标准。这听起来很多,不是吗?

另外,始终启用所有编译器警告。编译器会警告您“条件中的赋值,这通常不是预期的”,这正是这里的情况。

    word1 = getc(fp1); 
    word2 = getc(fp2);
  }

  if (word1 != word2){
     return 1;
   }else{
        return 2;
    }
}

如果您的函数返回bool,则最后一条if语句应简单地替换为return word1 == word2.

int main(int argc, char* argv[]){
  FILE *fp1 = fopen(argv[0], "r");
  FILE *fp2 = fopen(argv[1], "r");

这里缺少错误检查。如果其中一个fp1fp2为 NULL,则程序必须处理此错误。

  printf("%d", compareFilles(fp1, fp2));

  //closing the files
  fclose(fp1); 
  fclose(fp2);

  return 0;
}

推荐阅读