在中间读取并复制带有EOF指示的文件

时间:2010-10-05 17:16:52

标签: c++ c file-io eof

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

谢谢, 本雅明

2 个答案:

答案 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,其值在intunsigned char范围内(值为-1)。二进制数据的正确类型为EOF,而不是unsigned char