IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de lecture d'entête BMP avec "fscanf".


Sujet :

C

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Problème de lecture d'entête BMP avec "fscanf".
    Salut!

    En tentant de lire l'entête d'un fichier BMP ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FILE* bmpFile=fopen("c:/b.bmp","r");
    char c1=0,c2=0;
    int n=0;
    fscanf(bmpFile,"%c%c%d",&c1,&c2,&n);
    printf("%c%c\n%d\n",c1,c2,n);
    l'affichage donne:

    Or l'éditeur héxadécimal donne:
    42 4D 36 28 00 00
    Sinon,Ce qui donne bien : 'B' 'M' 10294 en lisant "00 00 28 36" car c'est en little endian.
    Cette valeur est exactement celle fourni par Windows.

    Même lu en big endian:
    36 28 00 00 vaut 908 591 104 ce qui entre bien dans un "int".

    Comment peut il sortir un 6?

    Plus drôle encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buffer[10]={0};
    fgets(buffer,6,bmpFile);
    printf("%c%c\n%d\n",buffer[0],buffer[1],buffer[2]);
    affiche 54.

    Est-ce que la lecture ne peut se faire qu'avec "fread"?
    Si oui pourquoi?
    Sinon, comment bien utiliser "fscanf" pour ce type d'opération?

    Merci de votre aide.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pour pouvoir lire ton fichier comme tu le souhaites, il faudrait l'ouvrir en binaire, pas en mode texte (comme tu le fais), utilise "rb" plutôt que "r" avec fopen... je suppose que ça devrait résoudre ton problème...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    D'abord pour lire correctement ton fichier, ouvre-le en binaire ("rb").
    Ensuite, comme je pense que debut du .BMP doit correspondre à une structure décrivant ce BMP, utilise un fread de la taille de cette structure, c'est la seule possibilité.
    On doit trouver quelque part la description des fichiers BMP, peut-être wotsite.com (de mémoire, je ne suis pas sûr de l'orthographe exacte).
    [edit] Grillé par swoog [/edit]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Avec "rb" le résulat est le même.
    c'est la seule possibilité.
    Pourquoi?
    Pourquoi "fscanf" ne lit il pas les données correctement?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    C'est parceque fscanf ne convient pas pour les fichiers binaires, comme son nom l'indique il sert pour les entrées formatées.
    Essaye fread, et ca ira mieux....
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    comme son nom l'indique il sert pour les entrées formatées.
    Quelle différence?
    Deux caractères suivis d'un entier en mémoire ça donne bien:
    1 byte-1 byte-4 byte.
    et "%c%c%d" effectue ce filtrage théoriquement:
    stocker un byte dans le premier caractère, un autre dans le deuxième et quatre autres dans le "int".
    Qu'en est il exactement alors?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par seriousme
    stocker un byte dans le premier caractère, un autre dans le deuxième et quatre autres dans le "int".
    Qui t'as dis que %d lit 4 octets ?

    %d transforme une suite de caractères ASCII en nombre.

    42 4D 36 28 00 00
    28 = '(', pas un chiffre donc il va pas plus loin.

    Suis les conseils plus haut.
    L'itération est humaine; la récursion, divine.

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Qui t'as dis que %d lit 4 octets ?
    %d transforme une suite de caractères ASCII en nombre.
    Merci j'ai ma réponse.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Généralement, pour lire un BMP, on fait plus simple:
    Un fread() (ou un ReadFile()) sur une structure BITMAPFILEHEADER (définie dans wingdi.h, mais c'est windows.h qu'il faut inclure)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de lecture de fichier .txt avec Flash
    Par cdevl32 dans le forum Flex
    Réponses: 0
    Dernier message: 25/05/2008, 17h35
  2. Problème de lecture d'image 2D avec Inventor/coin3D
    Par wafa_b dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 25/04/2008, 15h12
  3. [DOM4J] Problème de lecture de fichier xml avec dom4j
    Par santana2006 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/04/2006, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo