1

我使用下面的代码从一个二进制文件复制到另一个,但是第一个文件包含一些 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;
}

谢谢,宾亚明

4

2 回答 2

14

fgetc 返回一个 int,而不是 char ,因此您可以区分 EOF 和与 EOF 具有相同值的 char 。

改变:

char ch;

int ch

并且(如果你在 *nix 上通常不相关)

fs = fopen(infile,"r");  

fs = fopen(infile,"rb");  
于 2010-10-05T17:19:52.760 回答
1

0xFF不是EOF。-1 是EOF. 问题是您将 a 的int返回值存储getc在 achar中,它会折叠0xFF到 -1 上(实际上它是实现定义的行为,但这是常见的实现会做的事情)。

的返回值getc是一个int,其值在unsigned char或的范围内EOF(值为-1)。二进制数据的正确类型是unsigned char,不是char

于 2010-10-05T17:22:46.240 回答