我使用下面的代码从一个二进制文件复制到另一个文件,但是第一个文件包含一些EOF指示符(0xFF),因此复制功能实际上将文件复制到第一个EOF指示符。
例如:如果我的文件是{0x01, 0x02, 0x03, 0xFF, 0x01, 0x02, 0xFF, 0xFF}
,那么只有{0x01, 0x02, 0x03}
会被复制到新文件中。任何想法如何解决它(或者我可能在那里缺少一些东西......)
代码:
int Util_Copy_File(char* source, char* dest)
{
FILE *fs,*ft;
char ch;
char infile[100];
sprintf(infile, "%s", dest);
fs = fopen(infile,"r");
if(fs==NULL)
{
return -1;
}
ft = fopen(dest,"w");
if(ft==NULL)
{
fclose(fs);
return STATUS_FAIL;
}
while(1)
{
ch = getc(fs);
if(ch==EOF)
{
break;
}
else
putc(ch,ft);
}
fclose(fs);
fclose(ft);
return 0;
}
谢谢, 本雅明
答案 0 :(得分:12)
fgetc返回一个int,而不是一个char,因此您可以区分EOF和一个与EOF值相同的char。
变化:
char ch;
到
int ch
并且(如果你在* nix上通常不相关)
fs = fopen(infile,"r");
到
fs = fopen(infile,"rb");
答案 1 :(得分:1)
0xFF
不是EOF
。 -1是EOF
。问题是,您将int
的{{1}}返回值存储在getc
中,将char
折叠为-1(实际上是实现定义的行为,但这就是常见的实现将会这样做。
0xFF
的返回值为getc
,其值在int
或unsigned char
范围内(值为-1)。二进制数据的正确类型为EOF
,而不是unsigned char
。