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 :

fichier binaire : fread fait des siennes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    Par défaut fichier binaire : fread fait des siennes
    Bonjour à tous

    je ne comprends vraiment pas le comportement de mon programme. A la base c'est un code de C# que je dois porter en C. Ce code lit un fichier qui débute de cette manière :


    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
    4FNR01 90R1-40804182301ÿÿÿÿÿÿÿÿ2 6o3fOÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 8?3fOÿÿÿÿÿÿÿÿ2 8O3fOÿÿÿÿÿÿÿÿ2 8_3fOÿÿÿÿÿÿÿÿ2 93fOÿÿÿÿÿÿÿÿ2 9o3fOÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 @
    3fOÿÿÿÿÿÿÿÿ2 A3fOÿÿÿÿÿÿÿÿ2 A_3fOÿÿÿÿÿÿÿÿ2 Ao3fOÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 A3fOÿÿÿÿÿÿÿÿ2 B3fOÿÿÿÿÿÿÿÿ2 B3fOÿÿÿÿÿÿÿÿ2 B?3fOÿÿÿÿÿÿÿÿ2 B_3fOÿÿÿÿÿÿÿÿ2 B3fOÿÿ
    ÿÿÿÿÿÿ2 D/3fOÿÿÿÿÿÿÿÿ2 DO3fOÿÿÿÿÿÿÿÿ2 D_3fOÿÿÿÿÿÿÿÿ2 Do3fOÿÿÿÿÿÿÿÿ2 D3fOÿÿÿÿÿÿÿÿ2 E3fOÿÿÿÿÿÿÿÿ2 E_3fOÿÿÿÿÿÿÿÿ2 Q?3fOÿÿÿÿÿÿÿÿ2 QO3fOÿÿÿÿÿÿÿÿ2 X3fOÿÿÿÿ
    ÿÿÿÿ2 X/3fOÿÿÿÿÿÿÿÿ2 XO3fOÿÿÿÿÿÿÿÿ2 Y3fOÿÿÿÿÿÿÿÿ2 Y_3fOÿÿÿÿÿÿÿÿ2 Yo3fOÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 Y3fOÿÿÿÿÿÿÿÿ2 `3fOÿÿÿÿÿÿÿÿ2 `3fOÿÿÿÿÿÿÿÿ2 a3fOÿÿÿÿÿÿÿÿ2
    rO3fÿÿÿÿÿÿÿÿ2 s3fÿÿÿÿÿÿÿÿ2 s3fÿÿÿÿÿÿÿÿ2 sO3fÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 y/3fOÿÿÿÿÿÿÿÿ2 y_3fÿÿÿÿÿÿÿÿ2 yo3fÿÿÿÿÿÿÿÿ2 y3fOÿÿÿÿÿÿÿÿ2 ?3fÿÿÿÿÿÿÿÿ2 _3fOÿÿÿÿÿ
    ÿÿÿ2 /3fOÿÿÿÿÿÿÿÿ2 _3fOÿÿÿÿÿÿÿÿ2 o3fOÿÿÿÿÿÿÿÿ23fÿÿÿÿÿÿÿÿ2 3fOÿÿÿÿÿÿÿÿ2 3fÿÿÿÿÿÿÿÿ2
                                                                                       3fOÿÿÿÿÿÿÿÿ2
                                                                                                    3fOÿÿÿÿÿÿÿÿ2
                                                                                                                 ?3fOÿÿÿÿÿÿÿÿ2
                                                                                                                               O3fÿÿÿÿÿÿÿÿ2
     
    o3fOÿÿÿÿÿÿÿÿ2
                  3fOÿÿÿÿÿÿÿÿ2
                               3fOÿÿÿÿÿÿÿÿ2
    3fOÿÿÿÿÿÿÿÿ2
    Théoriquement, je dois reconnaître l'entête (4FNR01 90R1-40804182301), puis lire les valeurs suivantes pour les traiter. Le code en C# se sert d'un bytereader, bienheureux-soit-il! mais chez moi ça lit un truc complètement bizarre.

    Quand mon curseur est juste après l'entête, je lance un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread(temp, sizeof(char), 1, fichierentree);
    pour reconnaître l'entête de la sous partie. Evidemment temp est un char *, alloué et vide (100 caractères). Cet entête doit être égal à 50 en décimal, donc 32 en hexa, donc le caractère ' ' en ascii.
    sauf que après tests, je m'aperçois que temp est égal à "4". Si je demande à fread de lire plus de caractères, temp sera égal à "4 ". et jamais autre chose, même si je tape

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(temp, sizeof(char), 1000, fichierentree);
    .

    Ai-je mal compris la structure de mon fichier?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense surtout que tu as un problème de code autour de la lecture de ton fichier.

    Tu peux nous le montrer ce code (ouverture du fichier, déclaration de temp, boucle de lecture, ...) ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé 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
    Par défaut
    ok.

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    void fonction()
    {
            char ligne[100];
            char temp[100];
            char lignesortie[100];
            int i;
            int valide = 1;
            long compteur = 0;
     
            FILE * fichierentree;
     
            if((fichierentree = fopen(CHEMINFICHIER_EXTRACTION, "rb")) != NULL)
            {
                    for (i=0;i < 100 ; i++)temp[i] = '\0';
                    lignesortie[0] = '\0';
                    ligne[0] = '\0';
     
                    fread(temp,sizeof(char), 1,  fichierentree);
     
                    switch(atoi(temp))
                    {
                            case 0 :
                                            fread(ligne, sizeof(char), 32, fichierentree);                                        
                                            break;
                            case 4 :
                                            fread(ligne, sizeof(char), 33, fichierentree);                                        
                                            break;
                            default :
                                            printf("\nFormat d'entete non reconnu!\n");
                    }
     
                    fread(temp, sizeof(char), 1, fichierentree);//c'est là que ça rend un résultat dégueulasse
     
                    while (atoi(temp) == 50)
                    {
                            fread(temp, sizeof(char), 1, fichierentree);
                            fread(ligne, sizeof(char), 1, fichierentree);
                            valide = 1;
     
                            switch(atoi(temp))
                            {
     
                                    case 0 :
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp, sizeof(char), 8, fichierentree);
     
                                            BCDToString(temp);
     
                                            if(strlen(temp) != 11)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            strcat(lignesortie, ";");
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp, sizeof(char), 8, fichierentree);
     
                                            BCDToString(temp);
     
                                            if(strlen(temp) != 15)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            break;
     
     
                                    case 1 :
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp, sizeof(char), 8, fichierentree);
                                            BCDToString(temp);
                                            if(strlen(temp) != 11)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            strcat(lignesortie, ";");
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp,sizeof(char), 5, fichierentree);
                                            BCDToString(temp);
                                            if(strlen(temp) != 4)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            break;
     
                                    case 2 :
     
                                            fread(temp, sizeof(char), 13, fichierentree);
                                            break;
     
                                    case 3 :
     
                                            fread(temp, sizeof(char), 16, fichierentree);
                                            break;
     
     
                                    case 4 :
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp,sizeof(char), 8, fichierentree);
                                            BCDToString(temp);
                                            if(strlen(temp) != 15)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            strcat(lignesortie, ";");
     
                                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                                            fread(temp,sizeof(char), 14, fichierentree);
                                            BCDToString(temp);
                                            if(strlen(temp) != 5)
                                            {
                                                    valide = 0;
                                            }
                                            strcat(lignesortie, temp);
                                            break;
     
                                    case 5 :
     
                                            fread(temp, sizeof(char), 22, fichierentree);
                                            break;                       
     
                            }
                            for (i=0;i < 100 ; i++)temp[i] = '\0';
                            fread(temp, sizeof(char), 1, fichierentree);
                            if (!valide)
                            {
                                    printf("\nLa ligne %s est invalide!", lignesortie);
                                    lignesortie[0] = '\0';
                            }
                            AjouterEntree(CHEMINFICHIER_DECODAGE_FNR1, lignesortie);
                    }
            fclose(fichierentree);
            }
            else
            {
                    printf("\n fichier non trouve.\n");
            }
    }
     
     
     
    void BCDToString(char arr[])
    {
            int i = 0;
            int a = 0;
            int val;
            while (arr[i] != NULL)
            {
                    if (a == 0)
                    {
                            val = arr[i] >> 4;
                    }
                    else
                    {
                            val = arr[i] & 15;
                    }
                    a = 1 - a;
     
                    if (val < 10)
                    {
                            arr[i] = val;
                            //result += val.ToString();
                    }
                    else
                    {
                            break;
                    }
                    if (a == 0)
                    {
                            i++;
                    }
            }
     
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Où lis tu l'entete?

    J'ai l'impression qu'il manque une ligne dans ton code...

    Francois

  5. #5
    Membre confirmé 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
    Par défaut
    je lis l'entête dans le premier switch. La longueur de l'entête dépend du tout premier caractère du fichier (0 ou 4). C'est pour ça que je le met dans un switch.

    Je lis l'entête mais je n'en fais rien. C'est pour ça que je fais un fread puis que je réinitialise tout à \0 juste après. C'est juste pour avancer le curseur de lecture. alors tu pourrais me dire de faire un fseek, mais j'ai peur que le déplacement ne soit pas le même, étant donné que nous sommes dans un fichier binaire et que je n'y connais rien (et que je ne trouve pas de doc )

    Au moins, je suis sûr (j'ai fait un printf(temp)) que temp, après le premier switch, commence par la valeur suivant l'entête.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    D'après ce que j'ai compris (il n'y a pas beaucoup de commentaires pour aider le lecteur )

    Tu lis 1 octet, si c'est un '0', tu li 32 caractères de plus, si c'est un '4', tu en lis 33 de plus.
    puis tu lis un caractère supplémentaire et c'est là que cela part en live.

    Le problème que je vois, c'est que tu utilise la fonction atoi pour transformer une chaine de caractères en nombre mais tu n'es absolumment pas sûr que le paramètre soit une chaine de caractères (donc terminées par \0). Je pense même que c'est l'explication de ton erreur.

    donc il faut qu'après chacune de tes lectures, tu rajoutes le caractère \0 en fin de buffer (ou alors que tu initialise ton buffer à 0 à chaque fois avant de lire.

    Pour info,
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=0;i < 100 ; i++)temp[i] = '\0';
    et probalement plus rapide (mais en tout cas plus lisible)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Invité
    Invité(e)
    Par défaut
    Aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (atoi(temp) == 50)
    C'est un peu étrange : si tu lis un caractère unique, la valeur de atoi() sera comprise entre 0 et 9, pas 50. Cette boucle ne va donc pas être exécutée...

    Francois

  8. #8
    Invité
    Invité(e)
    Par défaut
    Alors je ne comprends pas... Tu disais au début :

    Citation Envoyé par crashtib Voir le message
    Théoriquement, je dois reconnaître l'entête (4FNR01 90R1-40804182301), puis lire les valeurs suivantes pour les traiter. Le code en C# se sert d'un bytereader, bienheureux-soit-il! mais chez moi ça lit un truc complètement bizarre.

    Quand mon curseur est juste après l'entête, je lance un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread(temp, sizeof(char), 1, fichierentree);
    pour reconnaître l'entête de la sous partie.
    Mais dans ton exemple, tu ne reconnais pas, et ne lis pas ce (4FNR01 90R1-40804182301). Du coup ton premier caractère est '4', et les 32 premiers caractères ne sont pas ce que tu penses... OU peut etre devrais tu en lire 22, ou 23?

    Francois

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

Discussions similaires

  1. mon ActionPerformed fait des siennes
    Par azer2k20 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 09/01/2007, 23h26
  2. Pop up qui fait des siennes !
    Par Sandara dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 13/06/2006, 16h40
  3. [VB]le WebBrowser fait des siennes
    Par mister3957 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/02/2006, 08h43
  4. strcmp me fait des siennes...
    Par esp dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2005, 11h43

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