2011-06-26 44 views
1

我正在寫的字比較兩個文件字符的程序。比較每個文件的函數返回一個取決於文件條件的值。我如何比較兩個文件逐個字符

函數返回0時這兩個文件是相同的,-1,如果兩個文件匹配,但在第二之前的第一個文件結束時,如果-2這兩個文件相匹配,而是在第一第二文件結束,並且指示正INT這些文件在不同的字符處。

#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 

和第二個包含

ae 

它給了我一個奇怪的返回值,並想知道這是爲什麼所以?

感謝您的幫助提前

+1

您應該更清楚「這個奇怪的錯誤」是什麼以及「奇怪的返回值」是什麼。 – Marlon

+0

如果所有字符都匹配,那麼跳出循環不能僅僅測試EOF中的兩個文件? – grok12

回答

3

你叫char_cmp(fp1, fp2))兩次 - 一次是在switch語句,並且在默認狀態下的第二次。第二次返回你在他們不同的第二個字符位置(或其他東西,真的太意外了:)
將其更改爲

int k = char_cmp(fp1, fp2)); 

,並使用k這些兩地:

switch(k) 
... 
printf("files differ: char %d\n", k); 

編輯:相等文件的情況下,無限循環發生,因爲在這種情況下:

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

cd成爲一些時刻永遠等於EOF。更改爲

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

並且一切正常。

3

要調用char_cmp()多次。第二次在printf()調用中返回與第一次調用不同的值,因爲文件指針已被使用。

呼叫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