WhiZTiM

comparing two binary files

Apr 12th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. //http://collabedit.com/6qv2p
  2.  
  3. #include <fstream>
  4. #include <cassert>
  5.  
  6. //Reference: https://en.cppreference.com/w/cpp/io/ios_base/iostate
  7.  
  8. class StreamCompare{
  9. private:
  10.     void assert_exceptions_are_turned_on(std::istream& s){
  11.         assert(s.exceptions() & std::ios_base::badbit);
  12.         assert(s.exceptions() & std::ios_base::failbit);
  13.     }
  14.  
  15. public:    
  16.     bool compare_two_streams(std::istream& stream1, std::istream& stream2){
  17.         assert_exceptions_are_turned_on(stream1);
  18.         assert_exceptions_are_turned_on(stream2);
  19.        
  20.         auto stream_size1 = stream1.tellg();
  21.         auto stream_size2 = stream2.tellg();
  22.        
  23.         if(stream_size1 != stream_size2){
  24.             return false;
  25.         }
  26.        
  27.         constexpr int bufferSize = 4*1024*1024;
  28.        
  29.         char buffer1[bufferSize];
  30.         char buffer2[bufferSize];
  31.        
  32.         stream1.seekg(0, std::ios_base::beg);
  33.         stream2.seekg(0, std::ios_base::beg);
  34.        
  35.         int data_read_so_far_on_both_streams = 0;
  36.        
  37.         while((!stream1.eof() && !stream2.eod()) && (data_read_so_far_on_both_streams < stream_size1)){
  38.             int data_to_read_on_both_streams = std::min({stream_size1 - data_read_so_far_on_both_streams, bufferSize});
  39.            
  40.             stream1.read(buffer1, data_to_read_on_both_streams);
  41.             stream2.read(buffer2, data_to_read_on_both_streams);
  42.            
  43.             int data_actually_read_on_stream1 = stream1.gcount();
  44.             int data_actually_read_on_stream2 = stream1.gcount();
  45.            
  46.             bool is_equal = std::equals(std::begin(buffer1), std::begin(buffer1) + data_actually_read_on_stream1,
  47.                                         std::begin(buffer2), std::begin(buffer2) + data_actually_read_on_stream2);
  48.             if(!is_equal){
  49.                 return false;
  50.             }
  51.         }
  52.         return true;
  53.     }
  54. };
Add Comment
Please, Sign In to add comment