如何在不使用系统复制命令的情况下将可执行文件的二进制代码复制到新文件中?

时间:2010-01-22 16:56:56

标签: c++ file binary

这是我的代码,但文件稍微小一些,不执行:

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
    ifstream infile(inFilename.c_str(), ios::binary);
    ofstream outfile(outFilename.c_str(), ios::binary);

    string line;
    // Initial read
    infile >> line;
    outfile << line;
    // Read the rest
    while( infile )
    { 
        infile >> line;
        outfile << line;
    }

    infile.close();
    outfile.close();

    return 0;
}

我做错了什么?有没有更好的方法来读取可执行文件的二进制文件并立即将其写入另一个名称?任何代码示例?

我需要在没有系统副本的情况下进行此操作,以便模拟写入磁盘。

4 个答案:

答案 0 :(得分:4)

一种方法是使用流插入器进行streambuf:

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
    ifstream infile(inFilename.c_str(), ios::binary);
    ofstream outfile(outFilename.c_str(), ios::binary);

    outfile << infile.rdbuf();
}

答案 1 :(得分:2)

即使您以二进制模式打开流,流operator>>()也会执行格式化输入。格式化输入期望看到由空格分隔的可打印字符串,但这不是像可执行文件那样的二进制文件。您需要使用流的read()函数读取该文件,并使用输出流的write()函数进行写入。

答案 2 :(得分:0)

脱离我的头顶:(没有错误检查)

编辑:改为修复虚假错误。

int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
  FILE* in = fopen(inFilename.c_str(),"rb");
  FILE* out = fopen(outFilename.c_str(),"wb");
  char buf[4096]; //1024 is a habit of mine. 4096 is most likely your blocksize. it could also be 2<<13 instead.
  int len;
  while( (len = fread(buf,1,1024,in)) > 0 )
  {
    fwrite(buf,1,len,out);
  }
  fclose(in);
  fclose(out);
}

答案 3 :(得分:0)

(unix)system cp命令不仅复制文件的内容,还复制(部分)文件权限,包括执行位。

确保您的副本还根据需要在输出文件上设置执行位。