C中复制的文件不起作用

时间:2016-05-05 23:59:53

标签: c

我试图在C中创建一个程序,该程序在命令行中接收文件路径作为参数并复制它。这是我的来源。

#include <stdio.h>
#include <stdlib.h>


int main(int args, char* argv[])
{
     if (args != 2)
     {
          printf("Error: Wrong number of arguments.\n");
          printf("Enter the path of the file to be copied as the only argument.\n");
          system("PAUSE");
          return 1;
     }
     FILE *fsource;
     FILE *fshellcode;

     if((fsource = fopen(argv[1],"rb")) == NULL)
     {
          printf("Error: Could not open source file. Either the path is wrong or the file is corrupted.\n");
          system("PAUSE");
           return 2;
     }

     if((fshellcode = fopen("shellcode.exe","wb")) == NULL)
     {
          printf("Error: Could not create shellcode.exe file.\n");
          system("PAUSE");
          return 3;
     }

     char c;
     while ((c = fgetc(fsource) != EOF))
     {
         fputc(c,fshellcode);
     }
     fclose(fsource);
     fclise(fshellcode;
     return 0;
}

当我输入工作exe的路径作为参数时,程序正确创建shellcode.exe并将源exe中的所有字节复制到其中。当我尝试执行新的exe时,我收到以下错误消息:

The version of this file is not compatible with the version of Windows you're running.

当源代码在我的64位Windows 7系统上正常运行时,这怎么可能?

2 个答案:

答案 0 :(得分:5)

一个问题是你需要声明

int c;

怎么会有所作为?好吧,你用值0xff读取的第一个字节(这将很快发生在像exe这样的二进制文件中)可能会被符号扩展为-1并且看起来像EOF。所以你可能没有复制整个文件。

然后第二个问题是你在

中有一个有趣的错字
while ((c = fgetc(fsource) != EOF))

!=的优先级高于=,因此编译器会将其解释为

while (c = (fgetc(fsource) != EOF))

因此,只要您阅读非EOF字符,c就会设置为1。

你想要的是

while ((c = (fgetc(fsource)) != EOF)

(另外,它不会有所作为,但你应该使用getcputc。是否有理由使用fgetcfputc ?)

答案 1 :(得分:1)

  • 使用 while((c =(fgetc(fsource))!= EOF)
  • 首先,它会从文件中获取值并与EOF进行比较,如果不是EOF而不是复制到变量(c)

  • 阅读Operator precedence in c