2015-05-28 16 views
0

我想按字節複製一個exe文件。我比較了2的十六進制文件,它們是完全不同的。好像還沒有得到加載某些值..有人能告訴我爲什麼複製這樣的文件不起作用嗎?

#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

int main(){ 

    ifstream fin("file.exe", ifstream::binary); 
    vector<char> buffer(1, 0); 


    ofstream newfile; 
    newfile.open("newfile.exe", ios::binary); 

    while (fin.read(buffer.data(), buffer.size())){ 
     streamsize s = fin.gcount(); 
     for (int i = 0; i < buffer.size(); i++){ 
      if (buffer[i] != EOF){ 
       newfile << buffer[i]; 
       cout << buffer[i] << endl; 
      } else { 
       break; 
      } 

     } 
    } 
} 
+0

您是否需要streamsize s = fin.gcount()語句?無論如何,你都不會使用它的結果。 –

+0

該向量是爲了防止我一次抓取多個字節。我比較EOF因爲迄今爲止工作。 – Jlegend

+2

最明顯的問題是'buffer [i]!= EOF'。由於'buffer [i]'包含一個字符,'EOF'不是一個字符,所以這個比較沒有意義。 –

回答

7

爲什麼你讀入,並用單char寫出來的載體? s的用途是什麼?你爲什麼試圖與IOStreams比較EOF?這段代碼似乎是C和C++的混合體,結果被完全破壞了!

以下是我會做:

#include <iostream> 
#include <fstream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    std::ifstream fin ("file.exe", std::ios::binary); 
    std::ofstream fout("newfile.exe", std::ios::binary); 

    std::copy(
     std::istream_iterator<char>(fin), 
     std::istream_iterator<char>(), 
     std::ostream_iterator<char>(fout) 
    ); 
} 

甚至只是:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream fin ("file.exe", std::ios::binary); 
    std::ofstream fout("newfile.exe", std::ios::binary); 

    fout << fin.rdbuf(); 
} 

沒有搞亂,沒什麼大驚小怪的!

這對一般情況下的碼流非常有效,但是,if all you want to do is perform a byte-for-byte file copy, you'd get your OS to do it for you。它可以做得比你快!例如,Windows上的CopyFile

+2

甚至更​​簡單:'newfile << fin.rdbuff();'在一行中。 –

+0

@DavidHaim:是或是:)('rdbuf') –

+0

我建議OP爲此找到一個OS API。操作系統應該有一些經過測試的優化文件複製功能。 –

0

謝謝你的所有幫助。這就是我最終完成工作的方式。

#include <iostream>  
#include <fstream>  
using namespace std; 

int main() { 
    ifstream is("file.exe", ios::binary); 
    ofstream fs("newfile.exe", ios::binary); 
    if (is) { 
     is.seekg(0, is.end); 
     int length = is.tellg(); 
     is.seekg(0, is.beg); 

     char * buffer = new char[length]; 

     is.read(buffer, length); 
     is.close(); 

     for (int i = 0; i < length; i++) { 
      fs << buffer[i]; 
     } 

     delete[] buffer; 
    } 
} 
相關問題