Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //http://collabedit.com/6qv2p
- #include <fstream>
- #include <cassert>
- //Reference: https://en.cppreference.com/w/cpp/io/ios_base/iostate
- class StreamCompare{
- private:
- void assert_exceptions_are_turned_on(std::istream& s){
- assert(s.exceptions() & std::ios_base::badbit);
- assert(s.exceptions() & std::ios_base::failbit);
- }
- public:
- bool compare_two_streams(std::istream& stream1, std::istream& stream2){
- assert_exceptions_are_turned_on(stream1);
- assert_exceptions_are_turned_on(stream2);
- auto stream_size1 = stream1.tellg();
- auto stream_size2 = stream2.tellg();
- if(stream_size1 != stream_size2){
- return false;
- }
- constexpr int bufferSize = 4*1024*1024;
- char buffer1[bufferSize];
- char buffer2[bufferSize];
- stream1.seekg(0, std::ios_base::beg);
- stream2.seekg(0, std::ios_base::beg);
- int data_read_so_far_on_both_streams = 0;
- while((!stream1.eof() && !stream2.eod()) && (data_read_so_far_on_both_streams < stream_size1)){
- int data_to_read_on_both_streams = std::min({stream_size1 - data_read_so_far_on_both_streams, bufferSize});
- stream1.read(buffer1, data_to_read_on_both_streams);
- stream2.read(buffer2, data_to_read_on_both_streams);
- int data_actually_read_on_stream1 = stream1.gcount();
- int data_actually_read_on_stream2 = stream1.gcount();
- bool is_equal = std::equals(std::begin(buffer1), std::begin(buffer1) + data_actually_read_on_stream1,
- std::begin(buffer2), std::begin(buffer2) + data_actually_read_on_stream2);
- if(!is_equal){
- return false;
- }
- }
- return true;
- }
- };
Add Comment
Please, Sign In to add comment