加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何检查Unix C中的文件是否相同?

发布时间:2020-12-15 21:05:37 所属栏目:安全 来源:网络整理
导读:如何使用Unix C检查一个文件是否与另一个文件相同(具有相同的内容)?我的意思是,当我不能使用fopen,fread,fclose但只是打开,阅读,关闭?我对答案表示感兴趣,这些答案显示了如何在Unix C中执行此操作. 我写了一个程序,将一个文件复制到另一个文件,但不知道如
如何使用Unix C检查一个文件是否与另一个文件相同(具有相同的内容)?我的意思是,当我不能使用fopen,fread,fclose但只是打开,阅读,关闭?我对答案表示感兴趣,这些答案显示了如何在Unix C中执行此操作.

我写了一个程序,将一个文件复制到另一个文件,但不知道如何检查它们是否相同:/:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    const char *in_filename = "in.txt",*out_filename = "out.txt";
    int in_fd,out_fd,bytes_read,bytes_written;
    int buffsize = 512;
    char buffer[512];
    int success = 0;

    in_fd = open(in_filename,O_RDONLY);
    if (in_fd == -1)
        return -1;
    out_fd = open(out_filename,O_WRONLY | O_APPEND,S_IRUSR | S_IWUSR);
    if (out_fd == -1)
        return -1;

    for(;;)
    {
        bytes_read = read(in_fd,buffer,buffsize);
        if (bytes_read > 0)
        {
            bytes_written = write(out_fd,bytes_read);
            if(bytes_written < 0)
                return -1;
        }
        else
        {
            if (bytes_read == 0)
            {
                if (close(in_fd) < 0)
                    return -1;
                if (close(out_fd) < 0)
                    return -1;
                success = 1;
                break;
            }
            else if (bytes_read == -1)
            {
                break;
                return -1;
            }
        }
    }

    if(success)
        fprintf(stdout,"%s","Success!n");

    return 0;
}

继承人我试过的:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,bytes_read_in,bytes_read_out;
    int buffsize = 512;
    char in_buffer[512],out_buffer[512];
    int the_same = 0;

    in_fd = open(in_filename,O_RDONLY);
    if (out_fd == -1)
        return -1;

    for(;;)
    {
        bytes_read_in = read(in_fd,in_buffer,buffsize);
        if (bytes_read_in > 0)
        {
            bytes_read_out = read(out_fd,out_buffer,buffsize);
            if(bytes_read_out > 0)
            {
                int i = 0;
                for(i=0; i<buffsize; i++)
                {
                    if(in_buffer[i] != out_buffer[i])
                        the_same = 0;
                }
                the_same = 1;
            }
        }
        else
        {
            if (bytes_read_in == 0)
            {
                if (close(in_fd) < 0)
                    return -1;
                if (close(out_fd) < 0)
                    return -1;
                break;
            }
            else if (bytes_read_in == -1)
            {
                break;
                return -1;
            }
        }
    }

    if(the_same)
        fprintf(stdout,"Files are the same!n");

    return 0;
}

但它显示文件是相同的,而他们不是:(

解决方法

您只需要同时读取两个缓冲区.例如(也可以考虑处理错误),根本不使用C标准库:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#define BUFFER_SIZE 1024

static int 
bufcmp(const void *p,const void *q,size_t n)
{
    const char *p1 = p;
    const char *p2 = q;

    while (n-- > 0) {
        if (*p1++ != *p2++)
            return 0;
    }

    return 1;
}

int
main(int argc,char *argv[]) 
{
    int fd1 = open(argv[1],O_RDONLY);
    int fd2 = open(argv[2],O_RDONLY);
    int same = 1;

    for (;;) {
        char buf1[BUFFER_SIZE],buf2[BUFFER_SIZE];
        ssize_t n1 = read(fd1,buf1,BUFFER_SIZE);
        ssize_t n2 = read(fd2,buf2,BUFFER_SIZE);

        if (n1 < n2) {
            same = 0;
            break;
        } else if (n1 == 0) {
            break;
        } else if (bufcmp(buf1,n1) == 0) {
            same = 0;
            break;
        }
    }

    if (same)
        write(STDOUT_FILENO,"Same content.n",14);

    close(fd1);
    close(fd2);    

    return 0;
}

NB(感谢user4815162342):这段代码并不完全正确.实际上,如果read返回的读取字节数小于请求的字节数,则不是错误.但是,为了缩短此代码,我没有包含此管理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读