web-dev-qa-db-fra.com

Lecture / écriture dans des fichiers binaires en C

Quelqu'un a-t-il un exemple de code capable d'écrire dans un fichier binaire? Et aussi un code capable de lire un fichier binaire et de le sortir à l'écran. En regardant des exemples, je peux écrire dans un fichier mais je ne parviens pas à lire correctement un fichier.

50
user1257114

Lire et écrire des fichiers binaires est à peu près la même chose que n'importe quel autre fichier, la seule différence est la façon dont vous l'ouvrez:

unsigned char buffer[10];
FILE *ptr;

ptr = fopen("test.bin","rb");  // r for read, b for binary

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer

Vous avez dit que vous pouviez le lire, mais que la sortie n'était pas correcte ... Gardez à l'esprit que lorsque vous "sortez" ces données, vous ne lisez pas de l'ASCII. Ce n'est donc pas comme imprimer une chaîne à l'écran:

for(int i = 0; i<10; i++)
    printf("%u ", buffer[i]); // prints a series of bytes

L'écriture dans un fichier est à peu près la même chose, à l'exception du fait que vous utilisez fwrite() au lieu de fread() :

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer

Puisque nous parlons de Linux, il existe un moyen facile de faire un contrôle de cohérence. Installez hexdump sur votre système (si ce n’est pas déjà fait) et dumpez votre fichier:

mike@mike-VirtualBox:~/C$ hexdump test.bin
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
...

Maintenant, comparez cela à votre sortie:

mike@mike-VirtualBox:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0

hmm, peut-être changer la printf en %x pour éclaircir un peu:

mike@mike-VirtualBox:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0

Hé regarde! Les données correspondent maintenant*. Génial, nous devons lire le fichier binaire correctement!

* Notez que les octets sont simplement échangés sur la sortie mais que les données sont correctes, vous pouvez les ajuster pour ce genre de chose.

82
Mike