Taille de buffer pour récupérer tous les octets d'un fichier

Résolu
cs_Tibabou Messages postés 129 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012 - 28 juil. 2007 à 12:00
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 28 juil. 2007 à 21:18
Bonjour,

    Je souhaite, tout simplement, récupérer tous les octets d'un fichier dans un tableau. Jusque là, rien d'extraordinaire.
J'essaie donc de récupérer les n octets d'un fichier BMP sans prendre l'entête (largeur*hauteur*3).
Ci-dessous, un résumé de mon code (j'ai mis l'essentiel et supprimé les différents tests).

unsigned char *bmpTab;
int width, height;

width = 624;
height = 352;

bmpTab = new unsigned char[width*height*3]; // tableau pour stocker l'image

FILE*fich;
fich=fopen("img.bmp","r");

fseek(fich,54, SEEK_SET); // je me place après l'entête
fread(bmpTab, 1, width*height*3, fich); // je lis tous les octets

fclose (fich);

Je récupère donc, théoriquement, un tableau de 624*352*3 = 658 944 octets.
Le problème, c'est qu'à la fin de mon tableau (bmpTab), j'ai plein d'octets avec la valeur '205'.
A l'affichage, ça donne : la première ligne et 1/4 de la deuxième en "gris clair" (RGB = 205 205 205).

J'essaie donc de ralonger mon buffer... et je me rend compte que quand je change "width*height*3" par "width*height*3+512" cela affiche bien tous les bons pixels.
(512 ou plus d'ailleurs...)
Constat : width*height*3+512 658 944 + 512 659 456 octets (la taille occupée sur le dique - cf propriétés du fichier)

La taille des clusters est de 4096 octets au maximum sur une partition formatée en NTFS mais il peut monter à 32Ko en FAT32, je n'ai pas envie d'allonger systématiquement mon buffer de 32768 octets pour être sûr que je récupèrerai tous les octets de mon fichier.

Quelqu'un peut-il me venir en aide ?
Merci d'avance.

Salutations
Tibabou

3 réponses

The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
28 juil. 2007 à 15:22
Salut

Essaies de mettre "rb" dans son fopen au lieu de "r" si t'es sous windows
parce que "r" tout seul t'a deja pose des problemes, ca lisait pas tout ce que tu lui demandais

Une autruche ne se cuit pas aux petits lardons
3
cs_Tibabou Messages postés 129 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
28 juil. 2007 à 16:00
Merci The_Guardian, tout fonctionne très bien.

Tibabou
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
28 juil. 2007 à 21:18
Bonsoir,

Juste une petite remarque, soit tu fais du c alors utilise malloc (ou calloc) pour allouer de la memoire, soit du c++, dans ce cas, tu utilises les fonctions c++ qui font bien pour ouvrir, lire et fermer le fichier...

Matt...
0
Rejoignez-nous