-2

コードの1つの条件が機能していません。この条件は、最初のファイルが4行になり、2番目のファイルが5行になる場合です。両方のファイルの最初の4行は同じですが、2番目のファイルの5行目は異なるか同じである可能性があります。私の出力は「はい、5行目に違いがあります」と表示する必要がありますが、これらのファイルは同一であると言っています。このコードを修正するにはどうすればよいですか?

最初のファイル:

one
two
three
four

2番目のファイル:

one
two
three
four
five

私のコード:

void diff(char* fileptr1, char* fileptr2)
{
  int maxlinelen=BUFF; //maximum line length buffer size

 /** string arrays pointers **/
  char *linebuffer1; 
  char *linebuffer2;      

  /** file pointers **/
  FILE *fp1;
  FILE *fp2;

  int line=0;    //line counter
  int counter=0; //identical flag

  linebuffer1=(char*)malloc(maxlinelen * sizeof(char*)); //memory allocation for linebuffers
  linebuffer2=(char*)malloc(maxlinelen * sizeof(char*));

  if((linebuffer1==NULL) || (linebuffer2==NULL))   //check memory allocating process
    {
     fprintf(stderr,"Command:diff :Memory allocating failed!\n");
      exit(1);
    }
  if(((fp1=fopen(fileptr1,"r"))!=NULL)&&((fp2=fopen(fileptr2,"r"))!=NULL))  //make sure both files open?
    {
      //read both files lines till end of line
      while(((fgets(linebuffer1,maxlinelen,fp1))!=NULL)&&((fgets(linebuffer2,maxlinelen,fp2))!=NULL)) 
    {
      while(strlen(linebuffer1)==maxlinelen-1) // perfect time for memory reallocating
        {
          maxlinelen*=DOUBLE;  //grow size
          linebuffer1=realloc(linebuffer1,maxlinelen * sizeof(char)); //reallocate memory to new size
          if(linebuffer1==NULL) //make sure allocation is succesfull
        {
          fprintf(stderr,"Command : diff :Memory reallocating failed for linebuffer1\n");
          exit(1);
        }
          fgets(linebuffer1+(maxlinelen/DIV-1),(maxlinelen/DIV)+1,fp1); //continue read line after reallocation
        }
      while(strlen(linebuffer2)==maxlinelen-1)
      {
        maxlinelen*=DOUBLE;
        linebuffer2=realloc(linebuffer2,maxlinelen * sizeof(char));
        if(linebuffer2==NULL)
          {
        fprintf(stderr,"Memory reallocating failed for linebuffer2\n");
        exit(2);
          }
        fgets(linebuffer2+(maxlinelen/DIV-1),(maxlinelen/DIV)+1,fp2);  //
      }
      line++;  //increae line counter


      if(strcmp(linebuffer1,linebuffer2)!=0)  //compare both line string arrays if not
             {
           printf("The files are different.The first difference is in line %d\n",line); //diff. here 
           exit(1);
         }

      if(strcmp(linebuffer1,linebuffer2)==0) //compare both line string arrays if same
             {
           counter++; //increase identical counter
         }
    }
      if(counter==line) //if identical counter equal total line
    {
      printf("The files are identical.\n");
    }
    }
  else {
    fprintf(stderr,"Command: diff :File  open failed!\n");

 }

  //fclose(fp1);fclose(fp2);
}
4

2 に答える 2

0

どちらかのファイルが終了すると、ファイルの読み取りループの終了比較が失敗すると思います。これにより、ファイルの最後の行が読み取られなくなり、行カウンター変数がインクリメントされます。

各行のfgetsの結果を記録するには、ヘルパー変数が必要になります。

于 2012-11-13T02:24:34.423 に答える
0

ここでは、2 つのファイルの fgets 結果に「&&」を使用しています。したがって、いずれかのファイルが EOF に達すると、比較は終了します。

5行目は決して比較されません。

while(((fgets(linebuffer1,maxlinelen,fp1))!=NULL)&&((fgets(linebuffer2,maxlinelen,fp2))!=NULL)

これを while ループ条件を変更し、相対ロジックを変更すると、コードを修正するのに役立ちます。

于 2012-11-13T02:22:22.330 に答える