2010-10-05 10 views
0

J'ai utilisé le code ci-dessous pour copier d'un fichier binaire à un autre, mais le premier fichier contient des indicateurs EOF (0xFF), la fonction de copie copie donc le fichier jusqu'à son premier indicateur EOF.Lire et copier le fichier avec l'indicateur EOF au milieu

Par exemple: si mon fichier est {0x01, 0x02, 0x03, 0xFF, 0x01, 0x02, 0xFF, 0xFF}, seul le code {0x01, 0x02, 0x03} sera copié dans le nouveau fichier. Toute idée comment le résoudre (ou peut-être que je manque quelque chose ...)

code:

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; 
} 

Merci, Binyamin

+0

Vous devez ouvrir le fichier sous la forme 'binary' (" rb "). Certains systèmes d'exploitation peuvent traiter les caractères non-ASCII comme un EOF. Par exemple, Windows traite 0x1A comme EOF lors de la lecture en mode texte. –

Répondre

11

fgetc retourne un entier, pas un char, alors vous pouvez faire la différence entre EOF et un caractère ayant la même valeur que EOF.

Change:

char ch; 

à

int ch 

Et (généralement pas pertinent si vous êtes sur * nix)

fs = fopen(infile,"r"); 

à

fs = fopen(infile,"rb"); 
+1

À droite, et comme c'est un fichier binaire, changez aussi le 'fopen()' du fichier de destination en 'fopen (dest," wb ")' –

+2

Il a même une wikipedia (sous-) page http: //en.wikipedia .org/wiki/Getchar # EOF_pitfall –

+1

Cela, ou même mieux utiliser 'fread' et' fwrite' pour lire et écrire plus d'un octet en une fois. – ndim

1

0xFF n'est pas EOF. -1 est EOF. Le problème est que vous stockez la valeur de retour int de getc dans un char, qui réduit 0xFF sur -1 (en fait c'est le comportement défini par l'implémentation mais c'est ce que les implémentations courantes feront).

La valeur de retour de getc est un int dont la valeur est soit dans la plage de unsigned char ou EOF (qui a une valeur -1). Et le type correct pour les données binaires est unsigned char, pas char.