2014-07-19 59 views
1

我目前正在尝试编写一次读取两个文件一个字节的程序(是的,我意识到繁重的I/O开销),但是我在增加FILE指针。我想编程来比较两个文件逐字节,并且getc不会是一个可行的选项,因为它只能用于字符,因为字符是一个字节。但是,我正在阅读两个文本文件,文本文件可能包含诸如整数,双精度等数字。因此,在这种情况下,我想从int/double的一部分中获取该字节并将其与其他文件进行比较(逐个字节的比较)。一次读取一个字节的两个文件

这是我到目前为止有:

#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; 
} 

我假设缓冲器1和缓冲器是一个字节的内容被读取?我需要将它们转换为数字来比较它们吗?我想我可以做的比较如下

(buffer1^buffer2) == 0 

,那么这将意味着他们是平等的基础上,XOR位运算

感谢您的帮助提前

+1

“GETC不会是一个可行的选择” - 你是非常,很困惑。你怎么猜“数字,如整数,双打等”存储在一个文件中? getc获得一个字节,您的fread也是如此,但getc的效率更高。 '(buffer1^buffer2)== 0'与'buffer1 == buffer2'的作用相同,但两者都比较地址,而不是字节。 –

+0

@JimBalter多于一个字节 – humblebeast

+0

“多于一个字节”只是一个字节序列。 –

回答

1

我很高兴在戏谑评论。也许是时候举个例子吧。

:在文本文件中,字母字符,如 “a” 将被解释为 'A'(97,或0x61)。数字字符(如“2”)的解释方式与“2”(50或0x32)相同。文件只是使用fgetc()的字母数字,标点符号或空白字符的集合,可以一次查看一个字符。

与你的断言相反,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:(两者相同)

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 

结果文件是不相等的

+0

非常感谢,我今天听到的最有用的信息 – humblebeast

+0

@humblebeast - 在发布这个答案后,我查看了最近的帖子历史。看来您在比较文件时对此感兴趣。你见过这些其他的方法/讨论:*** [1](http://stackoverflow.com/a/20688284/645128)***,*** [2](http://www.dreamincode.net/forums/topic/236817-how-will-i-compare-two-files /)***,*** [3](http://objectmix.com/asm-x86-asm-370/166774-byte字节 - 比较 - 重复的文件取景器,killer.html)***。 – ryyker

相关问题