2016-02-10 74 views
1

在這裏http://www.cplusplus.com/forum/general/94032/我發現了一個很好且快速的方法來按字節比較兩個文件。但它增強了依賴性。我現在正在Qt中開發一個程序。在純粹的Qt中有類似的優雅和/或相對快速的方式嗎?或者是否有任何其他算法來比較Qt中的兩個文件?我堅持不使用內存映射...按字節比較兩個文件

這是boost版本:

#include <iostream> 
#include <algorithm> 
#include <boost/iostreams/device/mapped_file.hpp> 
namespace io = boost::iostreams; 
int main() 
{ 
    io::mapped_file_source f1("test.1"); 
    io::mapped_file_source f2("test.2"); 

    if(f1.size() == f2.size() && std::equal(f1.data(), f1.data() + f1.size(), f2.data())) 
     std::cout << "The files are equal\n"; 
    else 
     std::cout << "The files are not equal\n"; 
} 
+3

請參閱http://blog.qt.io/blog/2007/10/15/file-mapping/ – kfsone

+2

絕對優雅。祝你好運,如果你的文件是500GB大。 –

+0

這是一個操作系統操作。 osx和linux有'cmp'命令(這裏是C源代碼:http://www.opensource.apple.com/source/gnudiff/gnudiff-10/diffutils/cmp.c?txt) – bibi

回答

1

最明顯的方法可以快速做出雖然我最怕的標準庫不讓它快:

std::locale::global(std::locale::classic()); 
std::ifstream f1("test.1"); 
std::ifstream f2("test.2"); 
typedef std::istreambuf_iterator isbuf_it; 
if (std::equal(isbuf_it(f1.rdbuf()), isbuf_it(), 
       isbuf_it(f2.rdbuf()), isbuf_it())) { 
    std::cout << "The files are equal\n"; 
} 
else { 
    std::cout << "The files are not equal\n"; 
} 

這是否是快速的可能取決於標準庫優化分段迭代算法。另一方面,由於讀取的內存在緩存中是新鮮的並且只被訪問一次,所以即使沒有任何分割優化,每個頁面在處理下一個頁面之前都很容易被讀取。這是很長一段時間,因爲我基準這種東西...