C++ 有人能告诉我为什么复制这样的文件不会';不行?

C++ 有人能告诉我为什么复制这样的文件不会';不行?,c++,windows,file,copy,C++,Windows,File,Copy,我正试图逐字节复制exe文件。我比较了2的十六进制文件,它们完全不同。似乎有些值没有加载进去 #include <iostream> #include <fstream> #include <vector> using namespace std; int main(){ ifstream fin("file.exe", ifstream::binary); vector<char> buffer(1, 0); o

我正试图逐字节复制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;
            }

        }
    }
}
#包括
#包括
#包括
使用名称空间std;
int main(){
ifstream-fin(“file.exe”,ifstream::binary);
向量缓冲区(1,0);
流新文件;
打开(“newfile.exe”,ios::binary);
而(fin.read(buffer.data(),buffer.size()){
streamsize s=fin.gcount();
对于(int i=0;iNefFix.P>为什么你用一个代码< char < />代码来读取和写入一个向量?<代码> s >代码>的目的是什么?为什么你试图用IoSokes来比较<代码> 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)
    );
}
#包括
#包括
#包括

#包括。它可以比你快得多!例如,在Windows上。

谢谢你的帮助。这就是我完成工作的原因

#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;
    }
}
#包括
#包括
使用名称空间std;
int main(){
ifstream是(“file.exe”,ios::binary);
流fs(“newfile.exe”,ios::binary);
如果(是){
is.seekg(0,is.end);
int length=is.tellg();
is.seekg(0,is.beg);
字符*缓冲区=新字符[长度];
is.read(缓冲区、长度);
is.close();
for(int i=0;ifs是否需要streamsize s=fin.gcount()语句?无论如何,您不使用它的结果。该向量是为了防止我一次捕获多个字节。我将其与EOF进行比较,因为到目前为止,这已经奏效。最明显的问题是
buffer[I]!=EOF
。因为
buffer[I]
包含一个字符,而
EOF
不是一个字符,这种比较毫无意义。@Jlegend:但您在这里抱怨它不起作用……一个问题是文件流是块设备,这意味着它喜欢在大块中传输数据。我建议向量的最小大小为512(公共扇区大小).甚至更简单:
newfile@DavidHaim:Yeah或that:)(
rdbuf
)我建议OP为此找到一个OS API。OS应该已经测试了一些优化的文件复制功能。
#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;
    }
}