c - 一次读取两个文件一个字节

标签 c pointers file-io duplicates bit-manipulation

我目前正在尝试编写一个程序,一次读取一个字节的两个文件(是的,我知道 I/O 开销很大),但是我在递增 FILE 指针时遇到了问题。我想编程逐字节比较两个文件,getc 不是一个可行的选择,因为它只适用于字符,因为字符是一个字节。但是,我正在读取两个文本文件,文本文件可能包含整数、 double 等数字。因此,在这种情况下,我想从 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;
}

我假设 buffer1 和 buffer2 是正在读取的一个字节的内容?我是否必须将它们转换为数字才能进行比较?我在想我可以做如下比较

(buffer1 ^ buffer2) == 0 

那么这将意味着基于 XOR 按位运算它们是相等的

提前感谢您的帮助

最佳答案

我喜欢评论中的玩笑。也许是时候举个例子了。

注意:在文本文件中,“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

和文件2

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

结果:文件不相等

关于c - 一次读取两个文件一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24843635/

相关文章:

objective-c - 当全局对象传递给函数时,在 Objective C 中实例化它们。关于对象范围的困惑

c++ - 访问对象的取消引用值的语法

c - memcpy 错误 : Segmentation fault (core dumped)

创建convert_line_endings函数

c - 如何将文本文件存储到 C 中的数组中

c - fcntl,lockf,哪个更好用于文件锁定?

c - 为什么这段随机化歌曲名称列表的代码会产生段错误?

c++ - C++从文件中读取格式化数据

c - 为什么 mmap() 按降序返回地址,而 malloc() 按升序返回地址?

c++ - 关于指针作为数组的一些疑问?