Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C中的open()、read()检查(逐字节)两个文件是否相等_C - Fatal编程技术网

使用C中的open()、read()检查(逐字节)两个文件是否相等

使用C中的open()、read()检查(逐字节)两个文件是否相等,c,C,我知道如何检查两个文件的内容是否相同。我是用fopen和fread制作的。但是,我在翻译代码时遇到一些问题,使用open和read而不是fopen和fread 当我这样运行程序时:/app file1.txt file2.txt(文件不相等)程序显示消息,它们不相等,这是完全正确的。当我尝试改为/app file1 file1时,它还显示文件不相等,这肯定不是真的。另一件事是使用code::Blocks它向我显示返回代码255,所以我觉得我搞错了什么,但不知道具体是什么 #include <

我知道如何检查两个文件的内容是否相同。我是用
fopen
fread
制作的。但是,我在翻译代码时遇到一些问题,使用
open
read
而不是
fopen
fread

当我这样运行程序时:
/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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int compareFileByByte(char*file1,char*file2)
{
int结果=0,c1,c2,br1,br2;
int fin1=-1,fin2=-1;
fin1=打开(仅限文件1);
fin2=打开(仅限文件2);
如果(fin1==-1)
{
佩罗(“公开”);
返回-1;
}
如果(fin2==-1)
{
佩罗(“公开”);
返回-1;
}
br1=读取(fin1和c1,1);
br2=读取(fin2和c2,1);
而((br1>0)和&(br2>0)和结果)
{
br1=读取(fin1和c1,1);
br2=读取(fin2和c2,1);
结果=(c1==c2);
printf(“%c%c\n”,c1,c2);
}
关闭(fin1);
关闭(fin2);
返回结果;
}
int main(int argc,字符**argv)
{
如果(argc<3)
{
printf(“示例用法:\n\n\t%s file1 file2\n\n”,argv[0]);
出口(-1);
}
其他的
{
printf(“%s%s\n”,argv[1],argv[2]);
if(compareFileByByByte(argv[1],argv[2]))
{
printf(“文件相等\n”);
}
其他的
{
printf(“文件不相等\n”);
}
}
返回0;
}

由于结果为0,您永远不会进入循环

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

你试过比较file1和file1的副本吗?@mch:是的,我试过了-结果与这里描述的相同:它表明这些文件不相等,程序的返回值是255,而不是0。我不确定你的代码是否适合将文件与自身进行比较:首先,它用于处理两个不同的文件。通过
char
而不是
int
应该是使用调试器的绝佳机会。做吧,很有趣!:-)另外,如果一个文件的前缀位于另一个文件的前缀之后,在第一行之后,您需要
results=(br1==br2)和&(c1==c2),则他不会处理这种情况。最后你也需要一个类似的修复(如果一个文件比另一个文件长,你不能在一个文件结束时停止比较)。尽管如此,
文件不相等,它返回255你有很多错误。至少四个。