2011-06-26 10 views
1

2つのファイルを文字ごとに比較するプログラムを作成しています。各ファイルを比較する関数は、ファイルの状態に応じて値を返します。 、両方のファイルが一致した場合、両方のファイル-1、同じであるが、第一のファイルが第二の前に終了した場合-2、両方のファイルが一致するが、第2ファイルは、最初の前に終了し、正の整数が示す場合2つのファイルを文字ごとに比較するには

関数は0を返しますファイルが異なる文字。

#include <stdio.h> 
#include <string.h> 
#define CMP_EQUAL 0 
#define CMP_EOF_FIRST -1 
#define CMP_EOF_SECOND -2 

int char_cmp(FILE *fp1, FILE *fp2); 

int main(void) 
{ 
    FILE *fp1; 
    FILE *fp2; 

    fp1 = fopen("input1.txt", "rb+"); 
    fp2 = fopen("input2.txt", "rb+"); 

    switch(char_cmp(fp1, fp2)) 
    { 
     case CMP_EQUAL: 
      printf("The Files are equal"); 
      break; 
     case CMP_EOF_FIRST: 
      printf("EOF on a.txt"); 
      break; 
     case CMP_EOF_SECOND: 
      printf("EOF on t.txt"); 
      break; 
     default: 
      printf("files differ: char %d\n", char_cmp(fp1, fp2)); 
      break; 
    } 

    if(fclose(fp1) != 0) 
    { 
     perror("fclose"); 
     /*other error handling*/ 
    } 

    if(fclose(fp2) != 0) 
    { 
     perror("fclose"); 
     /*other error handling*/ 
    } 

    return 0; 
} 

int char_cmp(FILE *fp1, FILE *fp2) 
{ 
    int c, d; 
    size_t byte = 0; 
    int same = 1; 

    do 
    { 
     byte++; 
    }while((c = fgetc(fp1)) == (d = fgetc(fp2))); 

    if(c == EOF && d != EOF) 
    { 
     return CMP_EOF_FIRST; 
    } 

    if(d == EOF && c != EOF) 
    { 
     return CMP_EOF_SECOND; 
    } 

    if(c != d) 
    { 
     return byte; 
    } 

    return CMP_EQUAL; 
} 

各ファイル内のすべての文字が一致するかどうかを確認した後、どのようにdoループから脱落するのだろうと思いました。なぜなら、私が試したとき、それは同じキャラクターを見つけて残りのものをチェックしない瞬間を壊すからです。

も、私は一つのファイルが含まれている場合は、この奇妙なバグencourteredました:

dee 

を2つ目は

ae 

が含まれているそれは私に奇妙な戻り値を与え、ということである理由思っていましたそう?事前

+1

「この奇妙なバグ」とは何か、そして「奇妙な戻り値」は何でしょうか。 – Marlon

+0

すべての文字が一致する場合、ループから脱出するには、EOFで両方のファイルをテストするだけでは問題ありませんか? – grok12

答えて

3

あなたは二回char_cmp(fp1, fp2))を呼び出す - 一度switch文では、デフォルトの状態では二度目。

switch(k) 
... 
printf("files differ: char %d\n", k); 
:二回目は、それはあなたが本当に予想外の二文字の彼らが異なる位置(または何か別の、:)
変更もこれらの両方の場所におけるk

int k = char_cmp(fp1, fp2)); 

にし、使用を返します。

EDIT:同じファイルの場合は無限ループがあるため、この状態で起こる:

(c = fgetc(fp1)) == (d = fgetc(fp2)) 

cdはいつでもEOFに等しくなります。それを

(c = fgetc(fp1)) == (d = fgetc(fp2) && c != EOF 

に変更してください。すべて正常です。

3

で任意の助け

おかげであなたはchar_cmp()複数回呼んでいます。ファイルポインタが使用されているため、printf()コールで2回目の呼び出しで最初の呼び出しと異なる値が返されます。

コールchar_cmp()一度、地域で返された値を格納します。

cmp = char_cmp(fp1, fp2); 
switch(cmp) 
{ 
case CMP_EQUAL: 
    printf("The Files are equal"); 
    break; 
case CMP_EOF_FIRST: 
    printf("EOF on a.txt"); 
    break; 
case CMP_EOF_SECOND: 
    printf("EOF on t.txt"); 
    break; 
default: 
    printf("files differ: char %d\n", cmp); 
    break; 
} 

私はあなたの論理の残りの部分が正しいかどうかわかりません。


実際には、ロジックが正しくありません。同一のファイルが提示されると、無限ループに入ります。私はあなたが問題を追跡することができると確信しています!

+0

ええ、その無限のループを与える私はこのコードを使用したいので、私はこの事を削除することができます私を提案してくださいすることができます – user1089679

2

両方が同時にEOFに達すると、while条件は真であり、EOF == EOFなので何度も繰り返してループを開始します。

私はあなたが最初に少なく「短く」なるようにすることをお勧めします。

+0

ありがとうadivce – user798774

関連する問題