[C++] Lecture d'un fichier bitmap
Résolu/Fermé
A voir également:
- [C++] Lecture d'un fichier bitmap
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
12 réponses
Utilisateur anonyme
5 févr. 2008 à 16:24
5 févr. 2008 à 16:24
Je ne peux pas mettre de unsigned char à cause de la fonction strcpy (c'est ma faute, j'ai oublié de le préciser dans le post), la fonction strcpy n'accepte que des const char.
Il y a t-il une alternative à strcpy ?
Il y a t-il une alternative à strcpy ?
Comment écrire et lire un fichier bipmap en C++? voir www.gravitomagnetism.com en fin de page d'accueil
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2008 à 16:29
5 févr. 2008 à 16:29
tu peux faire du cast de porc...
unsigned char* a,b;
...//du code
strcpy((char*)a,(char*)b);
vu que c'est codé sur le même nombre de bit, ça devrai passer.
à tester.
unsigned char* a,b;
...//du code
strcpy((char*)a,(char*)b);
vu que c'est codé sur le même nombre de bit, ça devrai passer.
à tester.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
6 févr. 2008 à 09:58
6 févr. 2008 à 09:58
Bonjour
J'ai effectué ce que tu m'as donné, j'ai de nouvelles erreurs encore du aux types et aux pointeurs.
J'ai fait
maintenant cette partie du code fonctionne mais j'ai des lignes:
je les ai remplacé par:
Il m'a mis une erreur (qui m'a semblé logique) comme quoi il ne pouvait pas comparer un pointeur avec un entier.
De là, j'ai retiré l'étoile dans la comparaison et l'erreur reste (ce qui ne me semble pas logique)...
Je dois mettre quoi pour que l'erreur disparaisse ?
Merci d'avance
J'ai effectué ce que tu m'as donné, j'ai de nouvelles erreurs encore du aux types et aux pointeurs.
J'ai fait
(unsigned char*) temp; .... strcpy((char*)signature,(char*)temp);
maintenant cette partie du code fonctionne mais j'ai des lignes:
if(temp[0]=='B' and temp[1]=='M') .....
je les ai remplacé par:
if((char*)temp[0]=='B' and (char*)temp[1]=='M') ....
Il m'a mis une erreur (qui m'a semblé logique) comme quoi il ne pouvait pas comparer un pointeur avec un entier.
De là, j'ai retiré l'étoile dans la comparaison et l'erreur reste (ce qui ne me semble pas logique)...
Je dois mettre quoi pour que l'erreur disparaisse ?
Merci d'avance
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
6 févr. 2008 à 14:25
6 févr. 2008 à 14:25
Bon déjà, tu n'as pas allou de meoire à temp, il est donc logicque que le programme fasse une erreur. Ensuite :
if(int i=0;i<bit;i++) remplace le if par un for pour avoir les autres valeurs.
Pour finir (mais ça c'est du détail), je ne pense pas que la taille soit en bit, mais plutôt en octet et un octet vaut 8 bits.
Il me semble qu'un char est codé sur 8bits, soit un octet, donc à chaque fois que tu fait fgetc tu lit au moins 8 bits.
pour coder 256 valeurs, il faut donc au moins un octet. Les int sont codé (en général) sur 4 octets.
if(int i=0;i<bit;i++) remplace le if par un for pour avoir les autres valeurs.
Pour finir (mais ça c'est du détail), je ne pense pas que la taille soit en bit, mais plutôt en octet et un octet vaut 8 bits.
Il me semble qu'un char est codé sur 8bits, soit un octet, donc à chaque fois que tu fait fgetc tu lit au moins 8 bits.
pour coder 256 valeurs, il faut donc au moins un octet. Les int sont codé (en général) sur 4 octets.
Utilisateur anonyme
6 févr. 2008 à 14:46
6 févr. 2008 à 14:46
J'avais bien mis for(int i=0;i<bit;i++), j'ai fais une faute de frappe dans le message. Il ne li quand même pas les autres infos (il le faisait toutefois avant que je ne transforme char temp[4] en unsigned char* temp)
Je me suis bien trompé dans les commentaire, c'est bien en octets, pas en bits... je vais corriger ça
Je me suis bien trompé dans les commentaire, c'est bien en octets, pas en bits... je vais corriger ça
Utilisateur anonyme
6 févr. 2008 à 14:56
6 févr. 2008 à 14:56
Le problème vient apparemment du pointeur (unsigned char* temp) mais je le fais pointer sur quoi ?
Je me demande pourquoi, il arrive à stocker les 2 premiers octets, puis ignore les autres sans faire de message d'erreur.
Je me demande pourquoi, il arrive à stocker les 2 premiers octets, puis ignore les autres sans faire de message d'erreur.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
6 févr. 2008 à 17:17
6 févr. 2008 à 17:17
Sit u ne veu pas t'enmerder, fait :
unsigned char temp[8];
sinon, unsigned char*temp = new (unsigned char)[8];//ou un truc dans le genre
unsigned char temp[8];
sinon, unsigned char*temp = new (unsigned char)[8];//ou un truc dans le genre
Utilisateur anonyme
7 févr. 2008 à 08:36
7 févr. 2008 à 08:36
Merci, apparemment ça fonctionne bien maintenant avec unsigned char temp[8];
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 févr. 2008 à 16:20
5 févr. 2008 à 16:20
0xFFFFFFC0 est négatif seulement si tu décide qu'il est négatif. En utilisant une rerésentation "unsigned" tu aura une autre valeur.
regarde là :
http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/fgetc.3.txt.html
le proto de fgetc () donne comme valeur de retour un int, à partir d'un unsigned char.
Donc, au final, attention aux types et à leur taille.
Donne la manip que tu fais. si tu met fgetc dans un tableau de char*, ça peut causer des soucis. Par contre, en unsigned char*, ça devrais passer.
regarde là :
http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/fgetc.3.txt.html
le proto de fgetc () donne comme valeur de retour un int, à partir d'un unsigned char.
Donc, au final, attention aux types et à leur taille.
Donne la manip que tu fais. si tu met fgetc dans un tableau de char*, ça peut causer des soucis. Par contre, en unsigned char*, ça devrais passer.
Utilisateur anonyme
6 févr. 2008 à 10:26
6 févr. 2008 à 10:26
Après quelques modifications de types. L'erreur ne s'affiche plus, il compile le programme mais à l'exécution. Il me met une erreur de segmentation donc je manipule mal mes pointeurs, je suppose que l'erreur se situe dans l'utilisation du pointeur temp mais je ne vois pas où. Je vais retaper le code de la fonction dans le message:
Le problème semble toutefois venir du début car il ne récupère pas toutes les valeurs...
int Image::set_param(FILE* file, int pos) { unsigned char* temp; //variable temporaire qui contient les octets du fichier bitmap int bit; //nombre de bit de l'info (2 ou 4) int test; //en fonction de la postion dans le fichier, l'info sera sur 2 ou 4 bits if(pos==0 or pos==26 or pos==28) bit=2; else bit=4; //se place à la postion pos dans le fichier à partir du début if((test=fseek(file,pos,SEEK_SET))!=0) return 0; //récupère l'info à cette position //(j'ai déjà une incohérence ici, il ne récupère que la première info) if(int i=0;i<bit;i++) { temp[i]=fgetc(file); printf("%d: %d\n",pos,(int)temp[i]); //pour voir s'il récupère bien les infos. } if(pos==0) { if((char)temp[0]=='B' and (char)temp[1]=='M') strcpy(signature,"Bitmap Windows"); ..... //Autres tests de caractères du même genre } if(pos==2) taille_fichier=(int)temp[0]+(int)temp[1]*256+(int)temp[2]*65536 +(int)temp[3]*16777216; if(pos==6) strcpy((char*)champ_reserve,(char*)temp); ... //Il y a une dizaine de positions à traiter dans le fichier, //c'est soit des caractères, soit des traitement de valeurs entières.
Le problème semble toutefois venir du début car il ne récupère pas toutes les valeurs...