2016-07-26 1 views
0

J'ai un fichier test.bin qui a contenu: 33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31 Quand je lis ce fichier, j'obtiens un tel résultat: 3333203046203133203035203534203635. Je peux Je ne comprends pas ce que je fais de travers.Lire le fichier binaire en C

void ReadBinFile() 
{ 
    int i; 
    FILE *ptr; 
    unsigned char buffer2[17]; 
    ptr = fopen("test.bin","r"); 
    fread(buffer2,sizeof(buffer2),1,ptr); 

    for(i = 0; i<17; i++) 
     printf("%x", buffer2[i]); 
} 
+2

Pourquoi ne vérifiez-vous pas le succès de 'fopen()'? Si cela échoue, vous appelez UB. –

+3

vous lisez un * fichier texte contenant des données hexadécimales *. En utilisant un [convertisseur ASCII vers hexadécimal] (http://www.asciitohex.com/) et vous verrez que '3333203046203133203035203534203635' est le bytes pour' 33 0F 13 05 54 65' –

+0

Essayez d'utiliser 'printf ("% c ", buffer2 [i]);' pour imprimer les données. Ensuite, il devrait sortir comme vous l'avez entré dans votre fichier texte. –

Répondre

8

Vous obtenez la bonne réponse. Vous avez écrit le fichier "33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31" Et vous obtenez la réponse "3333203046203133203035203534203635" qui se trouve être l'ASCII, en hexadécimal, des données que vous avez écrites .

Vous devez écrire les données dans un fichier binaire comme binaire et cela va résoudre votre problème.

** EDIT parce tis trop grand pour un commentaire **

Lorsque vous voulez travailler avec des fichiers binaires dont vous avez besoin pour ouvrir les fichiers sous forme binaire, écrire dans les fichiers binaires, comme lus à partir des fichiers comme binaire, etc. fprintf() ne fonctionne pas sur les fichiers binaires. Donc, pour vous faire le travail de code que vous devez effectuer ces modifications: (Ceci est un hack rapide de votre code, il faut beaucoup de polissage)

void WriteBinFile(void) 
{ 
    FILE *ptr; 
    unsigned char a[] = {0xFF}; 
    ptr = fopen("test.bin","wb"); 
    fwrite (a, sizeof(unsigned char), 1, ptr); 
    fclose (ptr); 
} 

void ReadBinFile(void) 
{ 
    static const size_t BufferSize = 17; 
    int i; 
    FILE *ptr; 
    unsigned char buffer2[BufferSize]; 

    ptr = fopen("test.bin","rb"); 
    const size_t fileSize = fread(buffer2, sizeof(unsigned char), BufferSize, ptr); 

    printf("File size = %d bytes\n", fileSize); 
    printf("Size of each item in bytes = %d\n", sizeof(unsigned char)); 

    for(i = 0; i < (fileSize/sizeof(unsigned char)); i++) 
    { 
     printf("0x%x ", (int)buffer2[i]); 
    } 
    fclose (ptr); 
} 

int main (void) 
{ 
    WriteBinFile(); 
    ReadBinFile(); 
    printf("\nPress enter to exit\n"); 
    return fgetc(stdin); 
} 

La fonction Write utilise fwrite() pour écrire des caractères dans le fichier à partir du tableau de données (avec un élément dans), il ferme ensuite le fichier. La fonction de lecture fait la même chose que précédemment, mais j'ai ajouté quelques diagnostics afin que vous puissiez vérifier la taille du fichier et des caractères. Il affiche également uniquement les données qu'il a lues, pas la mémoire initialisée dans le tampon.

De même, vous DEVEZ fermer les fichiers, sinon vous ne pourrez les rouvrir tant que votre programme ne sera pas fermé.

Des problèmes, juste crier.

+0

J'ai trouvé une solution pour écrire des données dans un fichier binaire comme binaire mais maintenant j'ai un problème avec la lecture de ces données à partir du fichier: 'unsigned char a = 0xFF; fprintf (ptr, "% 02x", a); J'ai écrit dans le fichier 0xFF, quand je l'ai lu de cette façon, j'ai 66: 'unsigned char b; fread (& b, sizeof (caractère non signé), 1, ptr_read); printf ("% 02X", b); ' – MyName

+0

66 en hexadécimal est en minuscule f. Je pense que le problème pourrait être comment vous ouvrez le fichier, je pense que vous devez définir le paramètre de mode à '" wb "' qui ouvrira le fichier pour l'écriture en binaire. Vous devez également ouvrir le fichier à lire en binaire. –

+0

'FICHIER * ptr; char non signé a = 0xFF; ptr = fopen ("test.bin", "wb"); fprintf (ptr, "% 02x", a); 'J'ai un fichier vide – MyName

1

Il semble que vous lisez le fichier sous forme de chaîne et non pas comme HEX. Par exemple: "3" comme chaîne est 0x33 et "" comme chaîne est 0x20. Donc ce que "33" est 0x333320 (le début de votre exemple). Cela explique le mal lire. J'espère que ça aide :)