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 :

Lecture dans un fichier binaire


Sujet :

C

  1. #1
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut Lecture dans un fichier binaire
    Salut tout le monde, j'ai posé un post équivalent il y a pas longtemps mais le problème n'est plus exactement le même.

    J'ai un comportement absurde d'une fonction qui lit un fichier binaire.

    La fonction lit les octets un par un à l'aide de fread, les stocke dans un char ptemp[10], puis le ptemp[0] est copié dans un char* temp pour former une string. La raison de ce détournement est que quand je fais fread(chaine, 1, 8, fichier) le fread s'arrête au premier caractère assimilé comme un \0. donc ça ne lit pas 8 octets généralement.

    bref.

    voici le bout de code :

    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
     
    char ligne[100];
            char temp[100];
            char lignesortie[100];
            int i;
            int valide = 1;
            long compteur = 0;
            int rep;
            char  ptemp[10];
     
    //...
     
                                            memset(temp, 0, 100);
                                            for(i = 0 ; i < 8 ; i++)
                                            {
                                                    fread( ptemp, 1, 1, fichierentree);
                                                    temp[i] = ptemp[0];
                                                    //printf("\ntemp[%d]->%c<- dec.->%d<- hex. ->%x<-\net ptemp = %d hex. %x",i,temp[i],temp[i], temp[i], ptemp[0],
    ptemp[0]);
                                                    printf("\nptemp[0] : ->%c<- ->%d<- ->%x<-", ptemp[0], ptemp[0], ptemp[0]);
     
    //...
    et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ptemp[0] : -> <- ->32<- ->20<-
    ptemp[0] : -><- ->-126<- ->ffffff82<-
    ptemp[0] : -><- ->0<- ->0<-
    ptemp[0] : -><- ->16<- ->10<-
    ptemp[0] : -><- ->0<- ->0<-
    ptemp[0] : -><- ->1<- ->1<-
    ptemp[0] : ->6<- ->54<- ->36<-
    ptemp[0] : ->o<- ->111<- ->6f<-

    voici l'extrait du fichier à lire (hexa)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    20 82 00 10 00 01 36 6F
    quelqu'un peut m'expliquer pourquoi la ligne en rouge? merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    ptemp est un tableau de char, et les char sur ta machine sont considérés comme signés. Du coup, 0x82 (plus grand que 0x80) est interprété par un nombre négatif, -126 (au lieu de 130).

    printf(%d) convertit ce nombre en entier, et l'imprime : comme ton char est signé, il te renvoie donc -126

    printf("%x") le convertit en entier, puis te renvoie la réprésentation hexadécimale de cet entier (-126), soit 0xFFFFFF82, parce qu'un entier c'est sur 32 bits...

    Si tu déclares ptemp comme des unsigned char, tu devrais avoir des résultats qui correspondent mieux à tes attentes.

    En général, c'est une bonne idée de partir du principe qu'une donnée binaire est non signée...

    Francois

  3. #3
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    okay, merci, je vais essayer, je te tiens au courant des avancées

  4. #4
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    ça marche! merci mon bon

    bonne journée

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

Discussions similaires

  1. [Débutant] C# sous Win8, lecture dans un fichier binaire en asynchrone
    Par yupa dans le forum C#
    Réponses: 2
    Dernier message: 14/06/2012, 14h35
  2. Lecture erronée de float dans un fichier binaire
    Par Bourrine dans le forum Langage
    Réponses: 10
    Dernier message: 23/05/2012, 09h12
  3. Réponses: 1
    Dernier message: 10/11/2008, 10h24
  4. Lecture formattée dans un fichier binaire
    Par YéTeeh dans le forum C++
    Réponses: 5
    Dernier message: 16/12/2007, 21h35
  5. Lecture ecriture dans un fichier binaire
    Par laetous dans le forum C
    Réponses: 13
    Dernier message: 26/08/2006, 08h50

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