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 :

Taille d'un fichier et avancement


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 Taille d'un fichier et avancement
    Bonjour à tous,

    j'ai un programme qui lit des lignes d'un fichier. Dans un but de confort j'ai mis en place un système de comptage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            double taillefichier;
    	double compteur = 0;
    	int pourcent = 0;
    	int palier = 0;
    ces variables sont initialisées comme suit :


    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
     
                    //pour connaitre la taille du fichier (l'ouverture du fichier est vérifiée)
                    fseek(fichier1 , 0, SEEK_END ); //On trouve la fin du fichier
                    taillefichier = ftell(fichier1);
                    fseek(fichier2 , 0, SEEK_END ); //On trouve la fin du fichier
                    taillefichier += ftell(fichier2);
     
                    //initialisation boucle
    		rewind(fichier2);
    		rewind(fichier1);
                    //...code...
     
                    //a chaque fois qu'une ligne est lue
                    fgets(donnee1, 100, fichier1);
    		compteur += sizeof(char) * strlen(donnee1);
     
                    //...code...
    et enfin pour l'affichage de la progression du traitement tous les 5% :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                            //à chaque fin de boucle
                            pourcent = compteur/taillefichier*100;
     
                            //comptage des infos pour avoir un ordre d'idee de l'avancement
                            if(((pourcent % 5) == 0)&&(palier != pourcent))
                            {
                                    printf("\n%d%c des lignes ont ete traitees.", pourcent, 37);
    				palier = pourcent;
                            }
    Le problème est que le pourcentage rendu va bien au-delà de 100%, la boucle s'arrête vers 140%... quelqu'un pourrait m'expliquer pourquoi?

    merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Par défaut
    Bonsoir,

    - ftell te renvoie le nombre d'octets en incluant les passages à la lignes de type \n.
    - strlen
    ignore ce retour à la ligne.

    A priori, sans l'avoir vérifié, je suppose que cela devrait donner un résultat plus cohérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    compteur += sizeof(char) * strlen(donnee1) + 2;
    pourcent = compteur/taillefichier*100;
    cordialement,
    A.

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Par défaut
    Il y a aussi la problèmatique des chaines "Multi Byte" il faut se référer à la fonction setlocale.

    Et aussi l'eternel problème des charsets et des CR/LF ou LF


  4. #4
    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 vous remercie de toutes vos réponses.

    delete j'interprète ta réponse comme ceci :



    tandis que google me fournit des réponses sur setlocale ou charsets qui ressemblent à ça



    donc je poursuis mes recherches

    quelqu'un aurait un petit lien pour expliquer en français ce que delete voulait me dire?

    C'est quoi charset? à quoi sert setlocale? (à part faire apparaître la page man sur google)


    Edit : après avoir ramé il semble qu' apparemment et selon les derniers ragots CR/LF doit être spécifié quelque part dans le programme... que selon le système où je fais tourner mon programme cela n'aura pas la même valeur... ok... mais tu crois que c'est juste du à ça? fin je trouve que ça fait beaucoup pour en arriver à 140%... mais je me trompe sûrement.

    Je vais essayer donc de voir si je ne devrais pas retrancher de compteur la valeur de CRLF, à savoir 2*sizeof(char)... j'ai bon?

    d'autre part je n'ai rien compris ni au rôle ni à la nature de la fonction setlocal...

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par crashtib Voir le message
    Bonjour à tous,

    j'ai un programme qui lit des lignes d'un fichier. Dans un but de confort j'ai mis en place un système de comptage.

    Le problème est que le pourcentage rendu va bien au-delà de 100%, la boucle s'arrête vers 140%... quelqu'un pourrait m'expliquer pourquoi?

    merci

    Pourquoi ne pas bêtement trouver ton compteur comme étant ftell de la position où tu es, et faire la division simple ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    //a chaque fois qu'une ligne est lue
                    fgets(donnee1, 100, fichier1);
                    ou_jen_suis = ftell(fichier);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                            pourcent = ou_jen_suis/taillefichier*100;
    ???

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par crashtib Voir le message
    Bonjour à tous,

    j'ai un programme qui lit des lignes d'un fichier. Dans un but de confort j'ai mis en place un système de comptage.
    <...>
    Le problème est que le pourcentage rendu va bien au-delà de 100%, la boucle s'arrête vers 140%... quelqu'un pourrait m'expliquer pourquoi?
    Ceci fonctionne :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define DBG 0
     
    #if DBG
    #include "ed/inc/prt.h"
    #else
    #define PRT_I(a)
    #endif
     
    #define FNAME "C:/Users/Emmanuel/Music/Florence/01.mp3"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "rb");
       if (fp != NULL)
       {
          /* pour connaitre la taille du fichier (l'ouverture du fichier est vérifiée) */
          fseek (fp, 0, SEEK_END);  /* On trouve la fin du fichier */
          {
             long taillefichier = ftell (fp);
     
             /* initialisation boucle */
             rewind (fp);
             PRT_I (taillefichier);
             /* ...code... */
     
             /* a chaque fois qu'un bloc est lu */
             {
                int n;
                char data[1u << 14];
                double palier = 0;
                int compteur = 0;
                while ((n = fread (data, 1, sizeof data, fp)) > 0)
                {
                   compteur += n;
                   PRT_I (compteur);
                   /* ...code... */
     
                   /* à chaque fin de boucle */
                   {
                      /* -ed- attention a faire une division reelle */
                      int pourcent = compteur * 100.0 / taillefichier;
     
                      PRT_I (pourcent);
                      /* comptage des infos pour avoir un ordre d'idee de l'avancement */
                      if (((pourcent % 5) == 0) && (palier != pourcent))
                      {
                         printf ("%d%% des lignes ont ete traitees.\n", pourcent);
                         palier = pourcent;
                      }
                   }
                }
             }
          }
          fclose (fp);
       }
       else
       {
          perror (FNAME);
       }
       return 0;
    }
    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
     
    5% des lignes ont ete traitees.
    10% des lignes ont ete traitees.
    15% des lignes ont ete traitees.
    20% des lignes ont ete traitees.
    25% des lignes ont ete traitees.
    30% des lignes ont ete traitees.
    35% des lignes ont ete traitees.
    40% des lignes ont ete traitees.
    45% des lignes ont ete traitees.
    50% des lignes ont ete traitees.
    55% des lignes ont ete traitees.
    60% des lignes ont ete traitees.
    65% des lignes ont ete traitees.
    70% des lignes ont ete traitees.
    75% des lignes ont ete traitees.
    80% des lignes ont ete traitees.
    85% des lignes ont ete traitees.
    90% des lignes ont ete traitees.
    95% des lignes ont ete traitees.
    100% des lignes ont ete traitees.
     
    Process returned 0 (0x0)   execution time : 0.088 s
    Press any key to continue.
    Avec debug :
    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
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
     
    taillefichier = 1966542
    compteur     = 16384
    pourcent     = 0
    compteur     = 32768
    pourcent     = 1
    compteur     = 49152
    pourcent     = 2
    compteur     = 65536
    pourcent     = 3
    compteur     = 81920
    pourcent     = 4
    compteur     = 98304
    pourcent     = 4
    compteur     = 114688
    pourcent     = 5
    5% des lignes ont ete traitees.
    compteur     = 131072
    pourcent     = 6
    compteur     = 147456
    pourcent     = 7
    compteur     = 163840
    pourcent     = 8
    compteur     = 180224
    pourcent     = 9
    compteur     = 196608
    pourcent     = 9
    compteur     = 212992
    pourcent     = 10
    10% des lignes ont ete traitees.
    compteur     = 229376
    pourcent     = 11
    compteur     = 245760
    pourcent     = 12
    compteur     = 262144
    pourcent     = 13
    compteur     = 278528
    pourcent     = 14
    compteur     = 294912
    pourcent     = 14
    compteur     = 311296
    pourcent     = 15
    15% des lignes ont ete traitees.
    compteur     = 327680
    pourcent     = 16
    compteur     = 344064
    pourcent     = 17
    compteur     = 360448
    pourcent     = 18
    compteur     = 376832
    pourcent     = 19
    compteur     = 393216
    pourcent     = 19
    compteur     = 409600
    pourcent     = 20
    20% des lignes ont ete traitees.
    compteur     = 425984
    pourcent     = 21
    compteur     = 442368
    pourcent     = 22
    compteur     = 458752
    pourcent     = 23
    compteur     = 475136
    pourcent     = 24
    compteur     = 491520
    pourcent     = 24
    compteur     = 507904
    pourcent     = 25
    25% des lignes ont ete traitees.
    compteur     = 524288
    pourcent     = 26
    compteur     = 540672
    pourcent     = 27
    compteur     = 557056
    pourcent     = 28
    compteur     = 573440
    pourcent     = 29
    compteur     = 589824
    pourcent     = 29
    compteur     = 606208
    pourcent     = 30
    30% des lignes ont ete traitees.
    compteur     = 622592
    pourcent     = 31
    compteur     = 638976
    pourcent     = 32
    compteur     = 655360
    pourcent     = 33
    compteur     = 671744
    pourcent     = 34
    compteur     = 688128
    pourcent     = 34
    compteur     = 704512
    pourcent     = 35
    35% des lignes ont ete traitees.
    compteur     = 720896
    pourcent     = 36
    compteur     = 737280
    pourcent     = 37
    compteur     = 753664
    pourcent     = 38
    compteur     = 770048
    pourcent     = 39
    compteur     = 786432
    pourcent     = 39
    compteur     = 802816
    pourcent     = 40
    40% des lignes ont ete traitees.
    compteur     = 819200
    pourcent     = 41
    compteur     = 835584
    pourcent     = 42
    compteur     = 851968
    pourcent     = 43
    compteur     = 868352
    pourcent     = 44
    compteur     = 884736
    pourcent     = 44
    compteur     = 901120
    pourcent     = 45
    45% des lignes ont ete traitees.
    compteur     = 917504
    pourcent     = 46
    compteur     = 933888
    pourcent     = 47
    compteur     = 950272
    pourcent     = 48
    compteur     = 966656
    pourcent     = 49
    compteur     = 983040
    pourcent     = 49
    compteur     = 999424
    pourcent     = 50
    50% des lignes ont ete traitees.
    compteur     = 1015808
    pourcent     = 51
    compteur     = 1032192
    pourcent     = 52
    compteur     = 1048576
    pourcent     = 53
    compteur     = 1064960
    pourcent     = 54
    compteur     = 1081344
    pourcent     = 54
    compteur     = 1097728
    pourcent     = 55
    55% des lignes ont ete traitees.
    compteur     = 1114112
    pourcent     = 56
    compteur     = 1130496
    pourcent     = 57
    compteur     = 1146880
    pourcent     = 58
    compteur     = 1163264
    pourcent     = 59
    compteur     = 1179648
    pourcent     = 59
    compteur     = 1196032
    pourcent     = 60
    60% des lignes ont ete traitees.
    compteur     = 1212416
    pourcent     = 61
    compteur     = 1228800
    pourcent     = 62
    compteur     = 1245184
    pourcent     = 63
    compteur     = 1261568
    pourcent     = 64
    compteur     = 1277952
    pourcent     = 64
    compteur     = 1294336
    pourcent     = 65
    65% des lignes ont ete traitees.
    compteur     = 1310720
    pourcent     = 66
    compteur     = 1327104
    pourcent     = 67
    compteur     = 1343488
    pourcent     = 68
    compteur     = 1359872
    pourcent     = 69
    compteur     = 1376256
    pourcent     = 69
    compteur     = 1392640
    pourcent     = 70
    70% des lignes ont ete traitees.
    compteur     = 1409024
    pourcent     = 71
    compteur     = 1425408
    pourcent     = 72
    compteur     = 1441792
    pourcent     = 73
    compteur     = 1458176
    pourcent     = 74
    compteur     = 1474560
    pourcent     = 74
    compteur     = 1490944
    pourcent     = 75
    75% des lignes ont ete traitees.
    compteur     = 1507328
    pourcent     = 76
    compteur     = 1523712
    pourcent     = 77
    compteur     = 1540096
    pourcent     = 78
    compteur     = 1556480
    pourcent     = 79
    compteur     = 1572864
    pourcent     = 79
    compteur     = 1589248
    pourcent     = 80
    80% des lignes ont ete traitees.
    compteur     = 1605632
    pourcent     = 81
    compteur     = 1622016
    pourcent     = 82
    compteur     = 1638400
    pourcent     = 83
    compteur     = 1654784
    pourcent     = 84
    compteur     = 1671168
    pourcent     = 84
    compteur     = 1687552
    pourcent     = 85
    85% des lignes ont ete traitees.
    compteur     = 1703936
    pourcent     = 86
    compteur     = 1720320
    pourcent     = 87
    compteur     = 1736704
    pourcent     = 88
    compteur     = 1753088
    pourcent     = 89
    compteur     = 1769472
    pourcent     = 89
    compteur     = 1785856
    pourcent     = 90
    90% des lignes ont ete traitees.
    compteur     = 1802240
    pourcent     = 91
    compteur     = 1818624
    pourcent     = 92
    compteur     = 1835008
    pourcent     = 93
    compteur     = 1851392
    pourcent     = 94
    compteur     = 1867776
    pourcent     = 94
    compteur     = 1884160
    pourcent     = 95
    95% des lignes ont ete traitees.
    compteur     = 1900544
    pourcent     = 96
    compteur     = 1916928
    pourcent     = 97
    compteur     = 1933312
    pourcent     = 98
    compteur     = 1949696
    pourcent     = 99
    compteur     = 1966080
    pourcent     = 99
    compteur     = 1966542
    pourcent     = 100
    100% des lignes ont ete traitees.
     
    Process returned 0 (0x0)   execution time : 0.341 s
    Press any key to continue.

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

    merci de vos réponses.

    ed je ne comprends pas le rôle de la bilio/fonction prt.h/prt_i()

    après une recherche google (où j'ai pu voir que tu officiais autre part que sur dvlp.com ), j'ai cru comprendre que c'était une biblio.h/fonction personnelle. Me trompe-je?

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    de toutes façons c'est pour debug..

    Sa manière ou la mienne marche...

  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
    certes, mais c'est pour la curiosité personnelle. Et vos codes en effet marchent, je vous en remercie. C'est juste que je n'aime pas utiliser des solutions que je maîtrise/comprends pas

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par crashtib Voir le message
    certes, mais c'est pour la curiosité personnelle. Et vos codes en effet marchent, je vous en remercie. C'est juste que je n'aime pas utiliser des solutions que je maîtrise/comprends pas
    Le code est ici :

    http://emmanuel-delahaye.developpez....b/ed/inc/prt.h

    Ces macros servent à générer du code qui sert à afficher le contenu d'un variable...

    Ici, si DBG vaut 0, la macro ne génère rien (pas de code, donc pas d'affichage).

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

Discussions similaires

  1. [JSP] Connaitre la taille d'un fichier
    Par dst dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 21/06/2004, 17h22
  2. Réponses: 5
    Dernier message: 15/04/2004, 13h24
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. fonction réduisant la taille d'un fichier
    Par Harry_polin dans le forum C
    Réponses: 22
    Dernier message: 27/11/2003, 13h56
  5. [VB6] [Réseau] Récupérer la taille d'un fichier avec inet
    Par pcpunch dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 20/02/2003, 21h38

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