有人能告诉我为什么复制这样的文件不起作用?

时间:2015-05-28 19:19:43

标签: c++ windows file copy

我试图逐字节复制exe文件。我比较了2的hex文件,它们是完全不同的。似乎某些值没有加载..

#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;
            }

        }
    }
}

2 个答案:

答案 0 :(得分:7)

为什么你用一个char读入和写出一个向量? s的目的是什么?为什么要尝试将EOF与IOStream进行比较?这段代码似乎是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

答案 1 :(得分: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;
    }
}