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

Bibliothèque standard C Discussion :

Problème fread() mauvaises valeurs


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Problème fread() mauvaises valeurs
    Bonjour,

    J'ai un petit probleme avec fread()...
    Je dois lire dans une partie binaire d'un fichier des donnees. (les types sont fournis dans la doc...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    typedef struct ScalingFactors ScalingFactors;
    struct ScalingFactors
    {
        float altitude;
    	float rough;
    	float zon_wind;
    	float merr_wind;
    	float atm_pres;
    	float ozone;
    	float rel_hum;
    	float *rad;
    	unsigned char *gain_set;
    	unsigned long samp_rate;
    	float *sun_spec_flux;
    	char spare_1;
    };
     
    ScalingFactors scalFact;
     
    void readInfoScalFact(char* filename, DataSetDescription dsd)
    {
        FILE *file = fopen(filename,"rb");
        if(file != NULL)
        {
            fseek(file,dsd.offset,SEEK_SET);
            fread(&scalFact.altitude,sizeof(float),1,file);
            fread(&scalFact.rough,sizeof(float),1,file);
            fread(&scalFact.zon_wind,sizeof(float),1,file);
            fread(&scalFact.merr_wind,sizeof(float),1,file);
            fread(&scalFact.atm_pres,sizeof(float),1,file);
            fread(&scalFact.ozone,sizeof(float),1,file);
            fread(&scalFact.rel_hum,sizeof(float),1,file);
            scalFact.rad = (float*)malloc(sizeof(float)*15);
            fread(scalFact.rad,sizeof(float),15,file);
            scalFact.gain_set = (unsigned char*)malloc(sizeof(unsigned char)*16*5);
            fread(scalFact.gain_set,sizeof(unsigned char),16*5,file);
            fread(&scalFact.samp_rate,sizeof(unsigned long),1,file);
            scalFact.sun_spec_flux = (float*)malloc(sizeof(float)*15);
            fread(scalFact.sun_spec_flux,sizeof(float),15,file);
            fread(&scalFact.spare_1,sizeof(char),1,file);
            fclose(file);
        }
        else
        {
            printf("Error while opening %s in binary mode",filename);
        }
    }
     
    void displayScalFact()
    {
        int i;
        printf("Scaling Factors : \n\taltitude : %lf\n\troughness : %f\n\tzonal wind : %f\n\tmeridional wind : %f\n\tAtmospherique pressure : %f\n\tOzone : %f\n\tRadiances :",scalFact.altitude,scalFact.rough,scalFact.zon_wind,scalFact.merr_wind,scalFact.atm_pres,scalFact.ozone);
        for(i=0;i<15;i++)
        {
            printf("\n\t\tRadiance (%i) : %lf",(i+1),scalFact.rad[i]);
        }
        printf("\n\tGain Set : ");
        for(i=0;i<16*5;i++)
        {
            printf("\n\t\tGain Set (%i) : %i",(i+1),scalFact.gain_set[i]);
        }
        printf("\n\tsampling rate = %ld",scalFact.samp_rate);
        printf("\n\tSpectral Flux : ");
        for(i=0;i<15;i++)
        {
            printf("\n\t\tSpectral Flux (%i) : %f",(i+1),scalFact.sun_spec_flux[i]);
        }
        printf("\n\tSpare : %i",scalFact.spare_1);
     
    }
    (Aucune erreurs de compilation)
    Voila, donc le probleme est que je n'ai que des valeurs erronnee, sauf pour les 80 lectures pour le "gain_set". J'affiche peut-etre mal les variables... Je sais pas... Je suis sur que c'est une erreur toute bete mais je ne trouve pas...

    Pour information je suis sous Windows XP avec Code::Blocks compilateur GNU GCC.

    Merci...

    PS : desole, mais je suis en stage en Angleterre => donc clavier QWERTY et je sais pas faire les accents .


    EDIT : Je viens de tester une autre solution : qui ne marche pas (meme resultats)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    typedef struct ScalingFactors ScalingFactors;
    struct ScalingFactors
    {
        float altitude;
    	float rough;
    	float zon_wind;
    	float merr_wind;
    	float atm_pres;
    	float ozone;
    	float rel_hum;
    	float rad[15];
    	unsigned char gain_set[80];
    	unsigned long samp_rate;
    	float sun_spec_flux[15];
    	char spare_1;
    };
     
    void readInfoScalFact(char* filename, DataSetDescription dsd)
    {
        FILE *file = fopen(filename,"rb");
        if(file != NULL)
        {
            fseek(file,dsd.offset,SEEK_SET);
            fread(&scalFact,sizeof(ScalingFactors),1,file);
            fclose(file);
        }
        else
        {
            printf("Error while opening %s in binary mode",filename);
        }
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le fait que tu lises correctement les 80 valeurs pour le "gain_set" laisse penser que la dimension du type des variables précédemment lues est correcte. Peut être s'agit-il d'une divergence big endian/little endian entre l'écriture du fichier et la lecture que tu opères. cela n'affecterait pas les unsigned char mais affecterait les float et les unsigned long.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Oui, il semblerait que ce soit le cas...
    Existe-t-il des fonctions qui permetteraient de faire l'inversion des Bytes ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    htonl etc

    et sa famille directe et réciproque
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Gao,
    Citation Envoyé par diogene Voir le message
    Le fait que tu lises correctement les 80 valeurs pour le "gain_set" laisse penser que la dimension du type des variables précédemment lues est correcte. Peut être s'agit-il d'une divergence big endian/little endian entre l'écriture du fichier et la lecture que tu opères. cela n'affecterait pas les unsigned char mais affecterait les float et les unsigned long.
    Normalement, little ou big endian touche tous les types.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Note supplémentaire: Les fonctions htonl() etc. n'inversent pas forcément les bytes. Ce sont des fonctions de conversion machine <---> big-endian.
    • Sur une machine x86, qui est en little-endian, ces fonctions font effectivement une inversion.
    • Sur une machine big-endian, ces fonctions ne modifient rien.

    Si le fichier est supposé être en big-endian dans tous les cas, ces fonctions sont donc parfaitement ce qu'il te faut pour une portabilité maximale.
    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.

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gao,
    ....
    Normalement, little ou big endian touche tous les types.
    Oui, sauf ceux qui ne font qu'un byte. Mais je n'est cité ici que ceux utilisés dans le programme du PO et qui donneraient alors des résultats erronés dans ses tests.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Note supplémentaire: Les fonctions htonl() etc. n'inversent pas forcément les bytes. Ce sont des fonctions de conversion machine <---> big-endian.
    • Sur une machine x86, qui est en little-endian, ces fonctions font effectivement une inversion.
    • Sur une machine big-endian, ces fonctions ne modifient rien.

    Si le fichier est supposé être en big-endian dans tous les cas, ces fonctions sont donc parfaitement ce qu'il te faut pour une portabilité maximale.
    quand je parlais de fonctions reciproques, c'est que quand tu recois, c'est ntohl etc , et quand tu emets c'est htonl (network to host & host to network)..

    Donc normalement ca converti "totomatiquement"
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet.
    Dans le cas de fichiers binaires, la seul contrainte est que le fichier binaire lui-même soit en ordre "network" (en l'occurence big-endian).

    Dans le cas contraire, ces fonctions ne seront d'aucune aide.
    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 récupération valeur inputbox
    Par markintell dans le forum Access
    Réponses: 3
    Dernier message: 10/01/2006, 14h25
  2. Problème avec les valeurs par défaut
    Par Steph Ace dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/12/2005, 09h55
  3. Réponses: 6
    Dernier message: 24/10/2005, 20h12
  4. problème avec une valeur decimal
    Par vbcasimir dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 13h52
  5. [Débutant] Problème de récupération valeurs Bean
    Par DanZzz dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/08/2005, 20h27

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