首页 > 其他分享 >比较两个文件是否相同的办法

比较两个文件是否相同的办法

时间:2023-08-18 22:22:45浏览次数:34  
标签:文件 const 相同 MAP int 办法 fd2 include open

  原本是朴素的遍历写法,后面改为mmap后速度提升飞快(大部分时候一秒以内可以出结果)。可以用于比较两个文件内容是否相同,包括图片也可以(图片用open函数打开后是一堆乱码,相当于比较乱码)。Talk is cheap, show me your code。

 

#include <iostream>
#include <fstream>
#include <cstring>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

const int MAX_LEN = 200;

bool isSameFile(const char s1[], const char s2[]) {
    int fd1 = open(s1, O_RDONLY);
    int fd2 = open(s2, O_RDONLY);

    if (fd1 == -1 || fd2 == -1) {
        std::cerr << "An error happend!\n";
        close(fd1);
        close(fd2);
        return false;
    }

    struct stat stat1, stat2;
    if (fstat(fd1, &stat1) == -1 || fstat(fd2, &stat2) == -1) {
        std::cerr << "Error getting file stats.\n";
        close(fd1);
        close(fd2);
        return false;
    }

    if (stat1.st_size != stat2.st_size) {
        close(fd1);
        close(fd2);
        return false;
    }

    char* map1 = static_cast<char*>(mmap(nullptr, stat1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0));
    char* map2 = static_cast<char*>(mmap(nullptr, stat2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0));

    if (map1 == MAP_FAILED || map2 == MAP_FAILED) {
        std::cerr << "Error mapping files to memory.\n";
        close(fd1);
        close(fd2);
        return false;
    }
    bool result = (memcmp(map1, map2, stat1.st_size) == 0);

    munmap(map1, stat1.st_size);
    munmap(map2, stat2.st_size);
    close(fd1);
    close(fd2);

    return result;
}

int main() {
    char ch1[MAX_LEN], ch2[MAX_LEN];
    std::cin >> ch1 >> ch2;
    std::cout << std::boolalpha;
    std::cout << isSameFile(ch1, ch2);  
}

 

标签:文件,const,相同,MAP,int,办法,fd2,include,open
From: https://www.cnblogs.com/ChebyshevTST/p/17641742.html

相关文章

  • linux虚拟机中各服务端口及配置文件路径
    查询端口状况命令:netstat-an|grep端口号查询服务状态(服务是否开启)命令:systemctl  status服务名开启服务命令:systemctl  start  服务名21端口:FTP文件传输服务22端口:SSH协议、SCP(文件传输)、端口号重定向23/tcp端口:TELNET终端仿真服务25端口:SMTP简单邮件传输服务53......
  • C语言多文件编程中全局变量的声明与定义会遇到的问题
    C语言多文件编程中全局变量的声明与定义会遇到的问题目录C语言多文件编程中全局变量的声明与定义会遇到的问题描述:1.创建3个文件,分别是main.c、test.h、test.c,具体代码如下:1.1.1test.h1.1.2test.h1.1.3main.c1.1.4这样能直接编译通过。2.创建3个文件,分别是main.c、test.h、te......
  • 给定n个多种颜色的球,如何将球分组,保证每组内球颜色不能相同,且分组的数量要最小。
    usingSystem;usingSystem.Collections.Generic;publicclassBallColorGroup{publicintColor{get;set;}publicintCount{get;set;}}publicclassBallColorGrouping{publicstaticList<List<int>>GroupBalls(List<int&g......
  • 父/子进程文件描述符继承机制导致socket bind失败的问题
    此问题来自项目上,应用程序本身由它的父进程启动,父进程监听SIGCHLD信号,即子进程退出时,父进程会收到这个信号,然后立即通过execlp重新启动子进程,确保子进程异常崩溃会被重新拉起来。而子进程(我们实际的业务应用)也会在某些地方fork新的进程,干别的事情。出现的问题是,进程被重新拉起......
  • 使用appuploader工具发布证书和描述性文件教程
    使用APPuploader工具发布证书和描述性文件教程之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到AppStore试试,于是找同学借了个苹果开发者账号,但没那么简单,还要用到Mac电脑的钥匙串申请发布证书和上传ipa,可没有Mac,同学的大老远的也不方便拿过......
  • java实现大文件上传控件
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1. 通过form表单向后端发送请求         <formid="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="pos......
  • Linux的文件类型
    1.查看识别在某个目录下文件类型:$ls-ld<filename>2.文件可能的类型,跟着不一样的后缀1–:regularfile2d:directory3c:characterdevicefile4b:blockdevicefile5s:localsocketfile6p:namedpipe7l:sym......
  • java实现大文件上传组件
    ​ 文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件。而且支持断点续传。通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场景,还有文件夹的下载场景。与传统业务需求相比,新的业务需求要求更高,难度也......
  • java实现大文件上传插件
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。......
  • 14csv文件操作
      importcsv'''csv文本操作,增删改查都需要遍历列表进行判断操作,如果要删除某行,可以delrow[1],del用于删除列表元素。defread_csv(file_path):"""读取CSV文件内容"""withopen(file_path,'r')asfile:reader=csv.read......