Прочитать и скопировать файл с индикатором EOF посередине - PullRequest
0 голосов
/ 05 октября 2010

Я использовал приведенный ниже код для копирования из одного двоичного файла в другой, но первый файл содержит некоторые индикаторы 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 ]

13 голосов
/ 05 октября 2010

fgetc возвращает int, а не char, поэтому вы можете определить разницу между EOF и char с тем же значением, что и EOF.

Изменение:

char ch;

до

int ch

И (обычно не имеет значения, если вы используете * nix)

fs = fopen(infile,"r");  

до

fs = fopen(infile,"rb");  
1 голос
/ 05 октября 2010

0xFF не EOF. -1 это EOF. Проблема в том, что вы сохраняете int возвращаемое значение getc в char, которое сворачивает 0xFF в -1 (фактически это поведение, определяемое реализацией, но это то, что будут делать обычные реализации). *

Возвращаемым значением getc является int, значение которого находится в диапазоне unsigned char или EOF (которое имеет значение -1). И правильный тип для двоичных данных - unsigned char, а не char.

...