C++文件逐字节对比

作为一个OIer,装逼的本事是必不可少的。最近,为了展示自己CPP水平,为同学们做了一个Cena(当然,命令行界面,很迷你)。但是,却在文件对比这个最重要的环节卡住了。

我想了很多办法,首先想到的就是向C++的各种库里要文件对比函数,但是无论怎么翻,都没有。既然装逼,那么我就想到了一个看起来深奥的解决方法:MD5对比。但是,文件一大,如一些矩阵输出什么的。它运行起来就一卡一卡的(下次装逼时卡了怎么办),于是还是想个更好的办法。

在这里,我体会到了,最笨的办法却恰恰是最有用的。我用两个ifstream变量,以二进制方法打开,首先比较两文件的长度,不等直接返回FALSE。如果相等,则拷贝到内存中。由于输出错误后,大小很难与正确答案相等,所以这个算法在大多数数据下是最优的。即使答案是AC的,输出也不会大到一种程度,所以没有卡顿现象。

现在上程序,首先看函数:

bool compfile(ifstream& in1, ifstream& in2){
     ifstream::pos_type size1, size2;
     size1 = in1.seekg(0, ifstream::end).tellg();
     in1.seekg(0, ifstream::beg);
     size2 = in2.seekg(0, ifstream::end).tellg();
     in2.seekg(0, ifstream::beg);
     if(size1 != size2)
         return false;
     size_t remaining = size1;//or size2
     while(remaining)
     {
         char buffer1[BLOCKSIZE], buffer2[BLOCKSIZE];//BOLCKSIZE=4096
         size_t size = min(BLOCKSIZE, remaining);
         in1.read(buffer1, size);
         in2.read(buffer2, size);
         if(0 != memcmp(buffer1, buffer2, size))
             return false;
         remaining -= size;
     }
     return true;
}

以引用形式读入两个参数,以节省速度。size1,size2表示两个文件的大小。如果不等了,直接返回FALSE。若相等,即开始比对,一个块的大小(BLOCKSIZE)被设置为4096字节。比对的字节从remaining中减去,直到remaining为0。如果真的不等,才返回true。

时间: 2024-10-18 21:40:41

C++文件逐字节对比的相关文章

计算目录下的md5值,用于文件被篡改后对比

计算/etc目录下的md5值,用于文件被篡改后对比,命令如下: find /etc/ -maxdepth 1 -type f | xargs -n1 md5sum> /root/etc_sum-$(date +%F).log 同样的道理, 我们可以将/usr/bin  /usr/sbin/ /usr/local/bin /root/bin 等等重要的目录下面的文件校验和都计算一遍,这样的话定期执行一下该命令,生成一份最新的校验和,通过diff命令将生成的log文件和原始的md5sum.log比较

1.4逐字节处理字符串

需要分别处理字符串中的各个字节 逐字节处理字符串 <?php /* * 需要分别处理字符串中的各个字节 * 逐字节处理字符串 */ $string = "This weekend, I'm going shopping for a pet chicken."; $vowels = 0; for($i = 0, $j = strlen($string); $i<$j; $i++){ if(strstr('aeiouAEIOU', $string[$i])){ $vowels+

PE文件加节感染之Win32.Loader.bx.V病毒分析

一.病毒名称:Win32.Loader.bx.V 二.分析工具:IDA 5.5.OllyDebug.StudPE 三.PE病毒简介: PE病毒感染的方式比较多,也比较复杂也比较难分析,下面就针对PE文件感染之加节的方式进行汇编层次的深度分析,其实说来惭愧,第一接触这个病毒样本的时候也有 点手足无措,最后还是在别人的指导下才顺利的分析下来,开始分析该样本的时候,仅仅关注这个样本是木马病毒这个特点而忽略他的PE感染的特性.下面就该样本的传播方 式进行逐一分析,其实还蛮怀恋分析样本的那些时间. 四.对

对象存储与块存储、文件存储等对比

看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 ! 背景: 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非PB级的扩展.不支持永远在线.专有的一体机设备等等,非结构化数据以每年60%-80%的速率增长,从而可扩展性变成了最迫切的需求. 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非

Object-c:两种文件读写的对比

一.读写方法对比:(主要针对本地读取本地文件) 方式\操作 读 写 非URL方式 stringWithContentsOfFile writeToFile URL方式 stringWithContentsOfURL writeToURL 实际开发中,大部分都采用URL方式. 对于写入操作,情况都是:如果文件存在,则覆盖原文件中的内容:如果文件不存在,则创建一个新文件 二.非URL方式 1.比较陌生的是文件写入的方法中,会有个atomically参数. atomically(原子性):设置YES时

PLSQL_Oracle外部表的概念和使用(案例)(通过外部表直接查询数据文件以节数据库表空间)

2014-08-25 BaoXinjian 一.摘要 ORACLE外部表用来存取数据库以外的文本文件(Text File)或ORACLE专属格式文件. 因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中. 外部表,顾名思义,存储在数据库外面的表. 当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT.UPDATE.DELETE操作). 不能对外部表建立索引.因为创建索引就意味着要存在对应的索引记录.而外部表其

Linux和Windows的遍历目录下所有文件的方法对比

首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 先看Linux的,返回的是DIR*,因此出错时返回NULL(0).而这里不用关心DIR结构具体定义,只需要知道是对它进行操作(注意:DIR不是保存文

Linux下创建与解压tar, tar.gz和tar.bz2文件及压缩率对比 | 沉思小屋

刚 在qq群里面一位仁兄问到文件压缩的命令,平时工作中大多用解压缩命令,要是遇到压缩就现查(这不是一个好习惯),于是整理下Linux下创建与解压 zip.tar.tar.gz和tar.bz2文件及他们之间压缩率对比,在自己的脑袋内存空间有限又不经常使用的时候以便于备忘.现整理如下: 目前Linux下常见的压缩文件扩展名: *.Z        compress程序压缩的文件(最早期使用),压缩后取代源文件: *.zip      一个夸平台的文件打包程序,适用于Linux.windows和Mac

文件内容差异对比方法

一.两个字符串的对比 1.两个字符串的对比输出 #!/bin/env python import difflib text1 = """text1: This module provides classes and functions for comparing sequences v7.5""" text1_lines = text1.splitlines() text2 = """text2: This modu