2016-06-11 43 views
2

我知道如何檢查兩個文件是否有相同的內容。我使用了fopenfread。不過,我在翻譯代碼時遇到了一些問題,請使用openread代替fopenfread檢查(逐字節)兩個文件是否相等,在C中使用open(),read()

當我運行這樣的程序:./app file1.txt file2.txt(和文件不相等)程序顯示消息,他們是不相等的,這是完全正確的。當我嘗試./app file1 file1時,它也顯示文件不相等,這是不正確的。另一件事是,使用Code::Blocks它顯示我返回代碼255所以我的東西我搞砸了,但不是什麼。

#include <unistd.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <errno.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <string.h> 
#include <stdlib.h> 

int CompareFileByteByByte(char *file1, char *file2) 
{ 
    int results = 0, c1, c2, br1, br2; 
    int fin1 = -1, fin2 = -1; 

    fin1 = open(file1, O_RDONLY); 
    fin2 = open(file2, O_RDONLY); 

    if (fin1 == -1) 
    { 
     perror ("open"); 
     return -1; 
    } 

    if (fin2 == -1) 
    { 
     perror ("open"); 
     return -1; 
    } 

    br1 = read (fin1, &c1, 1); 
    br2 = read (fin2, &c2, 1); 

    while((br1 > 0) && (br2 > 0) && results) 
    { 
     br1 = read (fin1, &c1, 1); 
     br2 = read (fin2, &c2, 1); 
     results = (c1 == c2); 

     printf("%c %c\n", c1, c2); 
    } 

    close(fin1); 
    close(fin2); 

    return results; 
} 


int main(int argc, char **argv) 
{ 
    if(argc < 3) 
    { 
     printf("Example usage:\n\n\t %s file1 file2\n\n", argv[0]); 
     exit(-1); 
    } 
    else 
    { 
     printf("%s %s\n", argv[1], argv[2]); 

     if(CompareFileByteByByte(argv[1], argv[2])) 
     { 
      printf("Files are equal\n"); 
     } 
     else 
     { 
      printf("Files are NOT equal\n"); 
     } 
    } 


    return 0; 
} 
+1

做你嘗試比較file1和文件1的副本? – mch

+0

@mch:是的,我做過了 - 結果與此處所述相同:它顯示這些文件不相等,程序的返回值爲255,而不是0. – yak

+0

我不確定您的代碼適合將文件與自身進行比較:畢竟,它是爲了處理兩個不同的文件。 – user3078414

回答

4

你永遠不會進入,因爲結果的循環是0

while((br1 > 0) && (br2 > 0) && results) 
+1

加上他不處理的情況下,當一個文件如果另一個文件的前綴 – fghj

+1

在* first *'br2 = read ...'行後,需要'results =(br1 == br2)&&(c1 == c2);'。而且最後還需要類似的修復(如果一個文件比另一個文件長,則不能只停止比較一個文件結束時)。 –

+0

Stil,'文件不相等',並返回255 – yak