2014-07-19 2 views
1

한 번에 한 바이트 씩 두 개의 파일을 읽는 프로그램을 작성하려고합니다. (예, I/O 오버 헤드가 큽니다.)하지만 파일을 늘리는 데 문제가 있습니다. 바늘. 두 파일을 바이트 단위로 비교하는 프로그램을 만들고 싶습니다. getc는 chars가 1 바이트이기 때문에 chars에서만 작동 할 수있는 가능한 옵션이 아닙니다. 그러나 두 개의 텍스트 파일에서 읽고 오전 및 텍스트 파일 int, double 등 같은 숫자를 포함 할 수 있습니다. 따라서 이러한 시나리오에서 int/double 부분에서 해당 바이트를 잡고 다른 파일을 비교할 싶습니다. (순차적 인 byte-by-byte 비교).한 번에 두 바이트 씩 읽음

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include <time.h> 

#define BUFFER_SIZE 1 

unsigned char buffer1[BUFFER_SIZE]; 
unsigned char buffer2[BUFFER_SIZE]; 

int main() 
{ 
    FILE *fp1, *fp2; 
    int ch1, ch2; 
    clock_t elapsed; 
    char fname1[40], fname2[40]; 

    printf("Enter name of first file :"); 
    fgets(fname1, 40, stdin); 
    while (fname1[strlen(fname1) - 1] == '\n') 
    { 
     fname1[strlen(fname1) -1] = '\0'; 
    } 

    printf("Enter name of second file:"); 
    fgets(fname2, 40, stdin); 
    while (fname2[strlen(fname2) - 1] == '\n') 
    { 
     fname2[strlen(fname2) -1] = '\0'; 
    } 

    fp1 = fopen(fname1, "r"); 
    if (fp1 == NULL) 
    { 
     printf("Cannot open %s for reading\n", fname1); 
     exit(1); 
    } 

    fp2 = fopen(fname2, "r"); 
    if (fp2 == NULL) 
    { 
     printf("Cannot open %s for reading\n", fname2); 
     exit(1); 
    } 

    elapsed = clock(); // get starting time 

    /* Read in 256 8-bit numbers into the buffer */ 
    size_t bytes_read1 = 0; 
    size_t bytes_read2 = 0; 

    bytes_read1 = fread(buffer1, sizeof(unsigned char), BUFFER_SIZE, fp1); 
    bytes_read2 = fread(buffer2, sizeof(unsigned char), BUFFER_SIZE, fp2); 

    printf("%c + in buffer 1\n", *buffer1); 
    printf("%c + in buffer 2\n", *buffer2); 

    fclose (fp1); // close files 
    fclose (fp2); 

    elapsed = clock() - elapsed; // elapsed time 
    printf("That took %.4f seconds.\n", (float)elapsed/CLOCKS_PER_SEC); 
    return 0; 
} 

내가 읽고있는 하나의 바이트의 내용입니다 buffer1와 buffer2를 가정입니다 : 여기

는 지금까지이 무엇인가? 그들을 비교하기 위해 번호로 변환해야합니까? 내가

(buffer1^buffer2) == 0 

을 다음과 같이 내가 비교를 할 수있는 생각하는 것은 그런 다음 그들이

+1

는 "getc 그룹은 실행 가능한 옵션이되지 않을 것"동일하지 - 당신은 아주이다, 매우 혼란. int, double 등의 숫자를 어떻게 생각하십니까? 파일에 저장되어 있습니까? getc는 바이트를 얻고 fread를하지만 getc는 훨씬 효율적입니다. '(buffer1^buffer2) == 0'은'buffer1 == buffer2'와 동일하지만 ... 둘다 바이트가 아닌 주소를 비교합니다. –

+0

@JimBalter 두 개 이상의 바이트 – humblebeast

+0

"두 개 이상의 바이트"는 단지 바이트 시퀀스입니다. –

답변

1

내가 농담에를 즐겼다 사전에 도움을

덕분에 XOR의 비트 연산을 기반으로 동일한 의미 의견. 어쩌면 예를 들어 보겠습니다.

: 텍스트 파일에서, 같은 "는"이 'A'로 해석 될 것 같은 알파 문자 (97, 또는이 0x61). "2"와 같은 숫자 문자는 '2'(50 또는 0x32)와 같은 방식으로 해석됩니다. 파일은 fgetc()를 사용하여 한 번에 한 문자 씩 볼 수있는 영숫자, 구두점 또는 공백 문자의 모음입니다.

fgetc()은 바이트 단위로 비교할 때 작동하지 않습니다. 다음은 간단한 예제입니다.

#include <ansi_c.h>//this is a collector of the ansi C headers. Pick the one in your 
        //environment that work for you. 
#include <limits.h> 

#define FILE1 "C:\\dev\\play\\file1.txt" 
#define FILE2 "C:\\dev\\play\\file2.txt" 

BOOL CompareFileByteByByte(char *file1, char *file2); 

int main(void) 
{ 

    if(CompareFileByteByByte(FILE1, FILE2)) 
    { 
     printf("Files are equal\n"); 
    } 
    else 
    { 
     printf("Files are NOT equal\n"); 
    } 


    return 0; 
} 

BOOL CompareFileByteByByte(char *file1, char *file2) 
{ 
    FILE *fp1=0, *fp2=0; 
    BOOL results = 0; 

    int c1 = 0, c2 = 0;//note, even though getc reads one char from file, 
         //it uses int as return to accomodate -1 (EOF) 

    fp1 = fopen(FILE1, "r"); 
    fp2 = fopen(FILE2, "r"); 


    c1 = fgetc(fp1); 
    c2 = fgetc(fp2); 

    results = (c1 == c2); 

    while((c1!=EOF) && (c2 != EOF) && results) 
    { 
     c1 = fgetc(fp1); 
     c2 = fgetc(fp2); 
     results = (c1 == c2); 
    } 

    return results; 
} 

을 감안할 때 FILE1 FILE2 : 같은 내용 파일 및 다른 내용을 파일에 대한 입력과 결과를 사용하여 코드 fgetc()보기 (모두 동일)

Oringinal text... 
...more text 123456 
...more text 2.3456 
...more text 3e12 

결과 : 파일이 같습니다.

FILE1

Oringinal text... 
...more text 123456 
...more text 2.3456 
...more text 3e12 

그리고 FILE2

Oringinal text... 
...more text 123456 
...more text 2.3456 
...more text 4e12 

결과을 감안할 때 63,210

: 파일이

+0

오늘 제가 들었던 가장 유용한 정보에 감사드립니다. – humblebeast

+0

@humblebeast -이 답변을 게시 한 후 내 게시물의 최근 기록을 살펴 보았습니다. 이 시점에서 파일 비교에 관심이있는 것으로 보입니다. 이 다른 접근법/토론을 보았습니까? *** [1] (http://stackoverflow.com/a/20688284/645128) ***, *** [2] (http://www.dreamincode.net/포럼/주제/236817-how-would-i-compare-two-files /) ***, *** [3] (http://objectmix.com/asm-x86-asm-370/166774-byte -byte-compare-duplicate-file-finder-killer.html) ***. – ryyker

관련 문제