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

  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
    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

  7. #7
    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
    .

  8. #8
    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

  9. #9
    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
    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?
    Je le lis. dans le premier switch. J'avance le curseur de lecture. et je mets la valeur 32 ou 33 car dans le code d'origine c'est 32 ou 33. On m'a dit que le code en C# marchait, donc je le prends tel quel.

    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.
    C'est bien vu, et corrigé. Mais le problème reste intact.

    Pour info,

    memset(temp, 0, 100);

    est équivalent à

    for (i=0;i < 100 ; i++)temp[i] = '\0';
    Merci de l'iinfo

    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...
    c'est ça qui m'interloque aussi, et c'est pour ça que je dis que je ne comprends rien aux fichiers binaires... Comprenons-nous, le fait de lire UN SEUL byte vient du code en C#. Dans ce code, un seul byte est lu, et le rendu est effectivement égal à 50!

    Pour info, voici un petit bout du code en C. Peut-être cela aidera-t-il.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BinaryReader br;
     
    br = new BinaryReader(File.OpenRead(fic));
     
    //lecture de l'entête
     
    byte dataEntete = br.ReadByte();
     
    			while (dataEntete == 50)
    			{
    				//traitements
     
                             //...

  10. #10
    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
    s'il vous plait... je suis en train de perdre mon après-midi sur une connerie... quelqu'un connaît assez bien les fichiers binaires pour m'expliquer?

  11. #11
    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
    Tu as essayé de suivre le fonctionnement de ton programme avec un debuggeur ? Cela risque de te montrer ce qui ne va pas bien dans ton code.
    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
    .

  12. #12
    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 n'ai pas de debugger. J'ai vi et gcc. donc pour débugger, je mets des printf dans mon code avec des messages explicites pour situer où le code s'éxécute et où il s'arrête. En l'occurence, ça ressemble à ça : printf("\n etape post-1er switch. temp ->%s<-\n",temp);

    c'est pour ça que je peux vous dire avec certitude que l'entête est lu, par exemple.

  13. #13
    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
    Citation Envoyé par crashtib Voir le message
    c'est pour ça que je peux vous dire avec certitude que l'entête est lu, par exemple.
    Oui mais tu ne peux pas dire avec certitude le contenu de cet entete.

    Tu n'as pas gdb installé sur ta machine ?
    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
    .

  14. #14
    Membre émérite 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
    Par défaut
    Citation Envoyé par crashtib Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    br = new BinaryReader(File.OpenRead(fic));
     
    byte dataEntete = br.ReadByte();
     
    			while (dataEntete == 50)
    			{
    				//traitements

    Citation Envoyé par crashtib Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    fread(temp, sizeof(char), 1, fichierentree);
     
                    while (atoi(temp) == 50)
                    {
    Ces deux codes ne sont pas vraiment identiques...
    Dans le premier, tu compares deux entiers.
    Et dans le deuxième, tu compares un entier à une donnée ascii convertie en entier.

  15. #15
    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
    tout à fait. Après mûre réflexion j'en ai déduis :

    1) je suis le roi des cons
    2) 50 vaut le caractère '2' en ascii
    3) tous les tests du code c# testent la valur numérique de l'ascii et non le caractère lui-même. Et vu que dans mon code C je ne lis pas des bytes mais des char, je me suis gourré
    4)je suis le roi des cons et j'ai perdu 5 heures de ma vie ET de mon temps de travail pour un truc auquel j'avais déjà réfléchi! conclusion==>je suis le roi des rois .

    merci à tous pour vos conseils.

    je résoud le topic.

  16. #16
    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
    et en plus non, ça ne marche toujours pas. Mais je sais pourquoi. la fonction fread refuse de lire au delà des caractère "normaux".

    je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(temp, 1, 1, fichier);
    me donne le même résultat que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread (temp, 1, 1000, fichier);
    mais nom de dieu pourquoi?

    pour rappel voici comment mon fichier est fait :

    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
    quelqu'un sait POURQUOI? quelqu'un sait pourquoi fread ne lit pas ce que je lui demande? c'est pas un \0, c'est pas un saut de ligne... pourquoi?

  17. #17
    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
    après avoir discuté avec un collègue, j'ai trouvé la cause du problème. Les caractères étaient correctement lus et stockés, mais la chaine lue contenait des '00', qui corresepondent à la fin de la chaîne... cool, ma matinée est perdue. J'ai voulu mettre cette anecdote sur VDM.com mais personne n'aurait compris. Et si ça avait été compréhensible, j'aurai eu masse de tlbm...

    allez merci tout le monde et à bientôt pour de nouvelles aventures

+ 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