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

    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