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 :

déplacement dans un fichier.txt


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Par défaut déplacement dans un fichier.txt
    Bonjour à tous,

    J'avais déjà poster des messages il me semble sur ce sujet mais bon j'ai fais pas mal de recherche et réussi à trouver pas mal de réponse à mes problème mais maintenant il me reste un problème important à réglé.

    c'est un exercice concernant un distributeur automatique de banques et je suis en train de faire l'historique qui permet de récupérer montant effectuer sur le solde et je met ceci dans un fichier txt.
    L'enregistrement et la lecture de fichier ne me pose pas de souci mais pour récupérer chaque valeur pour ensuite les réutilisé qui me pose pb car je ne vois par comment faire et j'ai du mal pour comprendre comment on peut se déplacer dans un fichier récupérer la valeur.

    exemple: je veux récupérer la valeur du solde du fichier texte a chaque début de programme

    je sais pas si je suis très clair enfin bref je met le fichier txt et lje met mon code de suite:

    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
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    #include <stdio.h>
    #include <stdlib.h>
    #include<time.h>
     
     
    //*** Definition variables globales car utilisées dans toout le programme ***//
     
        FILE *f;
        int caractereActuel;
        char reponse;
        int mdp=2468;
        int motdepasse;
        int choix;
        int montant;
        int nbrechequier;
        float creditcompte;
        float solde=5000.00;
        float autremontant;
        int garder,line,fd;
     
    //******************* Définition Structure historique **********************//
     
    struct historique
    {
        char timeis[12];
        char dateis[12];
        float montant_crediter;
        float montant_debiter;
        float solde_save;
    };
    struct historique histo;
     
     
    ///////////////////////////////////////////////////////////////////////
    //********************Debut Fonction Maint *************************//
    /////////////////////////////////////////////////////////////////////
     
    int main(void)
    {
     
        // définition des procédures
     
    void menu_principal();
    void ticket ();
    void retrait();
    void decouvert (float a);
     
     
    /* récupération de l'heure et la date système pour l'affecter ensuite à
    la struct tm (définition de la structure inclue dans le string.h)*/
    time_t datime;
    struct tm *tmptr = NULL;
    time (&datime);
    tmptr = localtime (&datime);
    sprintf (histo.timeis, "%dh%d", tmptr->tm_hour, tmptr->tm_min);
    // sprintf permet de mettre l'heure(un int )en chaine de caractère pour histo.timeis
    sprintf (histo.dateis, "%d-%d-%d", tmptr->tm_mday, tmptr->tm_mon+1, tmptr->tm_year+1900);
     
     
     printf("*********************************************************************** \n");
        printf("************  Bienvenue dans le distributeur automatique  ************* \n");
    	printf("*********************************************************************** \n\n\n\n\n");
     
    	printf("Veuillez entrer votre mot de passe : \t");
    	scanf("%ld",&motdepasse);
     
    	if(motdepasse != mdp)
    {//début if 1
        printf("\n Retapez votre code s'il vous plait!\n\n");
        scanf("%ld",&motdepasse);
     
            if(motdepasse!=mdp)
            { //début if2
               printf("\n Il vous reste encore une chance\n\n");
                scanf("%ld",&motdepasse);
     
                    if(motdepasse!=mdp)
                    { //début if3
                        printf("\n Vous etes bloquer\n\n");
                        return 0;
                    }//fin si 3
            }//fin si 2
    }//Fin si 1
     
    printf("\n Votre code est correct\n\n");
     
     
     
    menu_principal();
     
     return 0;
     
    }//fin du programme
     
    ///////////////////////////////////////////////////////////////////////
    //*********************Fin  Fonction Main **************************//
    /////////////////////////////////////////////////////////////////////
     
     
     
    ///////////////////////////////////////////////////////////////////////
    //***************Debut Procédure  Menu Principal *******************//
    /////////////////////////////////////////////////////////////////////
     
    void menu_principal()
    { // début menu_principal
     
    // déclaration variable(s) locale(s)
     
     
    printf("*********************************************************************** \n");
    printf("*  Choissez votre operation en appuyant sur la touche correspondante  * \n");
    printf("*********************************************************************** \n\n\n");
     
        printf("\t 1) \t Retrait \n");
        printf("\t 2) \t Consultation du solde \n");
        printf("\t 3) \t Crediter le compte \n");
        printf("\t 4) \t Historique \n");
        printf("\t 5) \t Commande de chequier \n");
        printf("\t 6) \t Quitter \n\n");
        printf("Faites votre choix: \t");
        scanf("%d",&choix);
     
     
        system("cls");
     
     
      switch (choix)
    {// début switch menu
     
     
        case 1:
     
    retrait();
        break;
     
     
     
     
        //fonction consultation solde
        case 2:
     
            printf("******************************************************************* \n");
            printf("********************* Consultation du solde *********************** \n");
            printf("******************************************************************* \n\n\n\n\n");
     
            f=fopen("historique.txt","r");
     
     
             while (! feof (f)){
       fgets (line, sizeof (line), f);
     
    garder = sscanf (line, "%s %s  %d %d %d", histo.timeis,histo.dateis,&histo.montant_crediter,&histo.montant_debiter,&histo.solde_save);
          if (garder != 4){
             fprintf (stderr, "ligne incorrecte\n");
             return -1;
           }
       /*
           et là tu fais ce que tu veux avec les montcred
       */
     }
     
    fclose(f);
        break;
        //fin fonction consultation solde
     
     
     
        //fonction crediter le compte
        case 3:
     
            printf("******************************************************************* \n");
            printf("*********************** Crediter le compte ************************ \n");
            printf("******************************************************************* \n\n\n\n\n");
     
     
            printf("Merci d'indiquer le montant a mettre sur votre compte? \t ");
            scanf("%f",&creditcompte);
            printf("\n\n  Le montant de %.2f euros sera bien crediter sur votre compte.  \n\n",creditcompte);
            solde += creditcompte;
            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
            printf("Merci de votre visite. A bientot. \n\n");
     
        histo.solde_save=solde;
        histo.montant_crediter=creditcompte;
        histo.montant_debiter=0;
     
        printf("%s",histo.timeis);
        printf("%s",histo.dateis);
        printf("solde sauver:%f",histo.solde_save);
        printf("montant crediter:%f",histo.montant_crediter);
     
        f=fopen("historique.txt","a+");
        fputs(histo.timeis,f);
        fputs ("\t",f);
        fputs(histo.dateis,f);
        fputs("\t",f);
        fprintf(f,"%.2f",histo.montant_crediter);
        fputs("\t",f);
        fprintf(f,"%.2f",histo.montant_debiter);
        fputs("\t",f);
        fprintf(f,"%.2f",histo.solde_save);
        putc('\n',f);
        fclose(f);
     
     
            menu_principal();
     
        break;
        //fin fonction crediter le compte
     
     
     
        //fonction historique
        case 4:
     
            printf("******************************************************************* \n");
            printf("**************************** Historique *************************** \n");
            printf("******************************************************************* \n\n\n\n\n");
     
     
                f= fopen("historique.txt", "r");
     
        if (f != NULL)
        {
            // Boucle de lecture des caractères un à un
            do
            {
                caractereActuel = fgetc(f); // On lit le caractère
                printf("%c", caractereActuel); // On l'affiche
            } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
            fclose(f);
        }
     
     
    menu_principal();
     
     
        break;
        //fin fonction historique
     
     
     
        //fonction commande chequier
        case 5:
     
            printf("******************************************************************* \n");
            printf("*********************** Commande de chequier ********************** \n");
            printf("******************************************************************* \n\n\n\n\n");
     
            printf("Veuillez saisir le nombre de chequier que vous desirez : \t");
            scanf("%ld",&nbrechequier);
            printf("\n\n Vous venez de commander %ld chequiers. \n\n");
            printf("Merci de votre visite. A bientot.\n\n");
     
     
     
     
        break;
        //fin fonction commande chequier
     
     
     
        //fonction quitter
        case 6:
     
            printf("******************************************************************* \n");
            printf("***************************** Quitter ***************************** \n");
            printf("******************************************************************* \n\n\n\n\n");
     
     
            printf("Etes vous sur de vouloir quitter?  O <oui>  ,  N <non> \t");
            scanf("%ls",&reponse);
     
            if (reponse == 'o')
            {
                ticket();
            }
            else if (reponse == 'n')
            {
               printf("coucou");
            }
     
        break;
        //fin fonction quitter
     
     
    }
    //fin switch menu
    }
    ///////////////////////////////////////////////////////////////////////
    //****************Fin Procédure  Menu Principal ********************//
    /////////////////////////////////////////////////////////////////////
     
     
     
     
    //////////////////////////////////////////////////////////////////////
    //**********************Debut Procédure Ticket**********************//
    //////////////////////////////////////////////////////////////////////
     
    void ticket ()
    {//debut ticket
     
    char choix_ticket;
     printf("\n\n\n**************   Choix du ticket   *************** \n\n\n");
     
                printf("Desirez vous un ticket ?  O <Oui>  ,  N <Non> \t");
     
       while(choix_ticket!='O'|| choix_ticket!='N')
        {//debut while
                scanf("%s",&choix_ticket);
     
                if (choix_ticket == 'O')
                {
                    printf("\n\n Impression du ticket en cours \n\n N'oubliez pas votre carte. Merci de votre visite. A bientot.\n\n");
                    menu_principal();
     
                }
                else if (choix_ticket == 'N')
                {
                    printf("\n\n N'oubliez pas votre carte. Merci de votre visite. A bientot.\n\n");
                    menu_principal();
                }
     
                    printf ("Veuillez resaisir, s'il vous plait \a\t");
     
        }//fin while
     
    }//fin ticket
     
    //////////////////////////////////////////////////////////////////////
    //**********************Fin Procédure Ticket************************//
    //////////////////////////////////////////////////////////////////////
     
     
     
     
    //////////////////////////////////////////////////////////////////////
    //***********************Debut Procédure retrait*******************//
    ////////////////////////////////////////////////////////////////////
     
    void retrait()
    {//debut fonction
     
            printf("******************************************************************* \n");
            printf("*************************** Le retrait **************************** \n");
            printf("******************************************************************* \n\n\n\n\n");
     
     
                printf("**************   Choix du montant   *************** \n\n\n\n\n");
     
     
     
                printf("1>  10 euros  \t\t\t  4>  100 euros \n");
                printf("2>  20 euros  \t\t\t  5>  200 euros \n");
                printf("3>  60 euros  \t\t\t  6>  400 euros \n");
                printf(" \t\t 7>  Autre montant  \n\n\n\n");
     
                printf("Veuillez saisir le montant desire : \t");
                scanf("%ld",&montant);
     
     
     
                    switch(montant)
                    {// début switch montant
                        case 1:
     
                            printf("\n Le montant que vous avez selectionnez est de 10 euros\t \n\n");
                            solde-=10;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
     
                        break;
     
                        case 2:
     
                            printf("\n Le montant que vous avez selectionnez est de 20 euros\t \n\n");
                            solde-=20;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
                        break;
     
                        case 3:
     
                            printf("\n Le montant que vous avez selectionnez est de 60 euros\t \n\n");
                            solde-=60;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
     
                        break;
     
                        case 4:
     
                            printf("\n Le montant que vous avez selectionnez est de 100 euros\t \n\n");
                            solde-=100;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
     
                        break;
     
                        case 5:
     
                            printf("\n Le montant que vous avez selectionnez est de 200 euros\t \n\n");
                            solde-=200;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
     
                        break;
     
                        case 6:
     
                            printf("\n Le montant que vous avez selectionnez est de 400 euros\t \n\n");
                            solde-=400;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
     
     
                        break;
     
                        case 7:
     
                            montant=autremontant;
                            printf("Veuillez selectionner le montant souhaiter : \t ");
                            scanf("%f",&autremontant);
     
                            solde-=autremontant;
                            printf("Votre solde restant est de : %.2f euros\t \n\n",solde);
                        break;
     
                    } //fin switch montant
     
    decouvert(solde);
    ticket();
     
    }// fin fonction retrait
     
    //////////////////////////////////////////////////////////////////////
    //***********************Fin Procédure retrait*********************//
    ////////////////////////////////////////////////////////////////////
     
     
     
     
     
    //////////////////////////////////////////////////////////////////////
    //********************Debut Procédure Decouvert*********************//
    //////////////////////////////////////////////////////////////////////
     
    void decouvert (float a)
    { //début decouvert
     
    // définition variable(s) locale(s)
        int seuil = -1000;
     
     
        if (a < seuil)
        {
            printf("\n\n Votre seuil de decouvert est atteint. \n Votre carte est bloquee \n\n");
            exit(1);
        }
        else if (a<0)
        {
            printf("\n\n Votre solde est actuellement debiteur \n\n");
     
        }
        else
        {
            printf("\n\n Votre solde est actuellement crediteur \n\n");
     
        }
     
    } //fin fonction découvert
     
    //////////////////////////////////////////////////////////////////////
    //********************Fin Procédure Decouvert***********************//
    //////////////////////////////////////////////////////////////////////
    historique.txt
    et voici le fichier texte

    merci de bien vouloir m'aider à mieux comprendre la gestion de fichier pour ensuite par exemple modifier juste une valeur ou supprimer une ligne du fichier

    encore merci pour ceux qui vont m'aider

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Première remarque: le format txt n'est pas le meilleur moyen de stocker ce genre d'informations, peut-être aurait il été plus adapté d'utiliser une base de données.

    Sinon, pour exploiter ton fichier, tu as à disposition toute la panoplie des fonctions de manipulations de fichier, notamment fgets, fseek, fprintf ...
    Cependant, pour supprimer une ligne, pas d'autre solution que de dupliquer ton fichier sans la ligne en question

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Par défaut
    pour le fichier c'est pas dérangeant d'utiliser un fichier texte pour sa ce que je fais c'est q'un exercice et non une application complexe et c'est pour m'habituer à manipuler les fichiers

    je sais que l'on peut utiliser fprintf fseek et tout mais j'ai beau lire des trucs dessus je n'arrive pas a comprendre.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Le premier problème à résoudre est celui de retrouver une information.
    Dans un fichier txt (sans table d'indexation gérée en parallèle), tu vas devoir balayer chaque ligne pour retrouver celle qui t'intéresse.

    Le plus simple est de retrouver chaque ligne avec fgets. Avant chaque fgets, tu mémorises la position courante dans le fichier avec fseek.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long offset;
    offset = fseek(fd,0L,SEEK_CUR /* 1 */);
    Quand tu tombes sur une ligne à modifier, tu reviens à la position d'avant la lecture par fseek:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fd,offset,SEEK_SET /* 0 */);
    et tu réécris ta ligne (après modification) par fwrite, fprintf ...

    Attention, cela nécéssite que ta ligne modifiée et ta ligne d'origine aient exactement la même longueur (sinon, tu vas devoir construire une copie de ton fichier avec les modifications puis renommer cette copie en ton fichier d'origine).
    De plus, tu dois ouvrir ton fichier en mode "READ-WRITE" pour pouvoir lire et écrire en même temps.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Pour récupérer les données de ton fichier, tu utilises la fonction fgets() pour une saisie ligne par ligne (Fais attention de traiter le cas des lignes trop longues qui sont tronquées par fgets). Ensuite, tu peut découper ta chaîne en éléments lexicaux (tokens) à l'aide des fonctions strtok ou strtok_r (déclarées dans string.h) http://man.developpez.com/man3/strtok.3.php, et utiliser strtol() et strtod() pour les conversions numériques.

    En ce qui concerne la modification de ton fichier, si ce dernier n'est pas trop gros et que tu peux le charger complètement en mémoire dans e.g. un tableau de caractères, c'est le plus simple. Tu modifies ton buffer et tu enregistre.

    L'article suivant traîte de structure de données avancées adaptées pour la manipulation de donnée textuelles http://ned.rubyforge.org/doc/crowley98data.ps.gz. Ce n'est pas nécessaire pour ce que tu veux faire. Ce type de structures est surtout utilisé pour programmer un éditeur de texte, ou pour les fichiers qui demandent des quantités importantes de modifications.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, pour parcourir les lignes et récupérer les valeurs fais comme ceci (c'est un exemple)

    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
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include <errno.h>
     
    #define FOPENERROR fprintf( stderr, "%s %d : fopen() failed (%s)\n",__FILE__, __LINE__, strerror( errno ))
     
    int main(void)
    {
     
      char namefile[]="essai.txt";
      FILE * file=fopen(namefile,"r");
      if(file==NULL)
      {
        FOPENERROR;
        exit(EXIT_FAILURE);
      }
     
      char line[1000], *p;
      double tab[5];
      unsigned int i,count;
     
      while(fgets (line, sizeof line, file) != NULL)
      {
        p=line;
        count=0;
        while(p!=NULL) tab[count++]=strtod(p,&p); /* convertion string to double */
        for(i=0;i<count;++i) fprintf(stdout,"%f\t",tab[i]);
        fprintf(stdout,"\n");
      }
     
      if(!feof(file))
      {
        fprintf(stderr,"%s %d : Error : a misreading occurred in file %s\n",__FILE__,__LINE__,namefile);
        return EXIT_FAILURE;
      }
     
      if(ferror(file))
      {
        fprintf(stderr,"%s %d : a misreading occurred in file %s\n",__FILE__,__LINE__,namefile);               
        return EXIT_FAILURE;
      }
     
      fclose(file);
     
      return EXIT_SUCCESS;
    }
    le fichier essai.txt contient ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    2 5.3 7 6.3 9.6
    4 5 8.2 1.01 4.2
    3.2 2.3 4.8 96 5.7
    points très importants : fgets lit une ligne et strtod convertit la string en double.

  7. #7
    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
    Personellement je changerais le format de la date, pour permettre des recherches extrêmement rapide :

    200703151430 200.40 0.00 5200.40

    Du coup faire des recherches par rapport au temps sur un tel fichier se fait extrêment rapidement (fseek, ftell) en dichotomique...

    C'est ce que j'ai fait pour une énorme base opérationnelle en temps réel (6 Gigs par an, jusqu'à 250000 lignes/heures), et ça marche quelle que soit la date demandée réponse en moins 1/10 seconde.

  8. #8
    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 josse95
    <...>De plus, tu dois ouvrir ton fichier en mode "READ-WRITE" pour pouvoir lire et écrire en même temps.
    Et puis fait une sauvegarde de ton fichier avant, on ne sait jamais...

  9. #9
    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
    mais je ne ferais pas fgets systématique... trop long.

    Si c'est pour trouver le bon enregistrement, je ferais un ftell, fseek , et d'abord une lecture caractère par caractère sur les n premiers pour vérifier la bonne date.

    Si ça t'intéresse, j'ai exactement ce cas en exemple.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Par défaut
    oui cela m'intéresse merci d'avance pour vos réponse je testerai vos réponse d'ici peu.

    PS: est-ce que ceci est bon? car quand j'essaie d'afficher le solde_save pour tabhisto[0] il m'affiche 0.0000

    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
    while (! feof (f))
    {
    i++;
       fgets (line, sizeof (line), f);
       garder = sscanf (line, "%s %s %f %f %f",tabhisto[i].timeis,tabhisto[i].dateis,&tabhisto[i].montant_crediter, &tabhisto[i].montant_debiter, &tabhisto[i].solde_save);
      if (garder != 5)
      {
             fprintf (stderr, "ligne incorrecte\n");
             return -1;
    }
     
     }
    printf("%f",tabhisto[0].solde_save);
     
     
    merci

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

    Exemple d'un fichier texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    19980703000001030 +47.6594 -119.7997 -010 0 02 0
    19980703000002020 +50.0643 -112.9062 -008 0 01 0
    19980703000003050 +46.9485 -98.9884 -032 0 03 0
    19980703000004010 +46.9653 -98.8784 -010 0 01 0
    19980703000005010 +48.0120 -97.9841 +004 0 01 0
    19980703000005040 +44.9860 -107.5454 -018 0 01 0
    Ce fichier contient toutes données de l'année et s'appelle 1998. Mais il pourrait faire un mois, une semaine, c'est pareil...

    Et maintenant comment l'explorer :
    (Note : il y a des variables globales)

    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
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
     
    /* Variables globales */
    static int CurrentPos=0, InitPos=0, LastPos=0 ;
    static int InitSearch=0, CurrentLength=0 ;
    static FILE *CurrentFile = (FILE *)NULL ;
    static char **Filenames = (char **)NULL ;
    static char Line[150] ;
     
     
    /*
     * C h e c k s _ F o r _ D a t e
     *
     */
    static int Checks_For_Date ( char *DateToFind ) 
    {
       char c=0 ;
     
    /*
    --- Eventually gets to the beginning of line if we are right in the middle
    */
       if ( (CurrentPos != 0) && (InitSearch == 0) )
         {
             for ( ; ; )
    	   {
    	      c = fgetc (CurrentFile);
    	      if ( (c != 13) && (c != 10) && (c != EOF) )
    		{
    		  fseek (CurrentFile, -2, SEEK_CUR);
    		}
    	      else
    		  break ;
    	   }
     
    	 if ( c != EOF )
    	   {
    	     CurrentPos = ftell(CurrentFile) ;
    	     fseek (CurrentFile, CurrentPos, SEEK_SET);
    	   }
    	 else
    	   {
    	     CurrentPos = 0 ;
    	     fseek (CurrentFile, 0L, SEEK_SET);
    	   }
         }
     
    /*
    --- And now gets the line
    */
       fgets (Line, 18, CurrentFile) ;
       if ( DEBUG )
         fprintf (stderr, "\nHas read : %s",Line);
     
       /* Checks if we do not have a strange line */
       if ( strlen(Line) < 17 )
        {
          fseek (CurrentFile, -18, SEEK_CUR);
          for ( ; ; )
    	{
    	  c = fgetc (CurrentFile);
    	  if ( (c != 13) && (c != 10) && (c != EOF) )
    	    {
    	     fseek (CurrentFile, -2, SEEK_CUR);
    	    }
    	  else
    	    break ;
    	}
     
          if ( c != EOF )
    	{
    	  CurrentPos = ftell(CurrentFile) ;
    	  fseek (CurrentFile, CurrentPos, SEEK_SET);
    	}
          else
    	{
    	  CurrentPos = 0 ;
    	  fseek (CurrentFile, 0L, SEEK_SET);
    	}
     
          fgets (Line, 18, CurrentFile) ;
          if ( DEBUG )
    	fprintf (stderr, "\nHas read (2) : %s",Line);
       }
       fseek (CurrentFile, CurrentPos, SEEK_SET);
     
       return  ( strncmp (DateToFind, Line, strlen(DateToFind)) );
    }
     
     
     
    /*
     * F i n d s _ R e l a t i v e _ P o s i t i o n
     *
     */
    static int Finds_Relative_Position ( char *TimeToCheck )
    {
    int s ;
     
       if ( CurrentPos == CurrentLength )
         return (+1) ;
     
       s = Checks_For_Date ( TimeToCheck ) ;
     
       if ( SEARCH )
         if ( InitSearch )
           InitSearch = 0 ;
     
       if ( s < 0 )
           return (-1) ;
       else
           if ( s > 0 )
    	   return (+1) ;
           else
    	   return (0) ;
    }
     
     
    /*
     * O p e n s _ D a t a b a s e
     *
     */
    static int Opens_Database ( char *DateToFind )
    {
     float lat, lon ;
     int   val, cc ;
     
    /*
    --- If not open opens the file
    */
       if ( CurrentFile == (FILE *)NULL )
         {
    	if ( StartingFile != -1 )
    	    CurrentFile = fopen ( Filenames[StartingFile], "r" );
    	else
    	  {
    	     if ( Finds_File_For_Date ( DateToFind ) != ERROR )
    		 CurrentFile = fopen ( Filenames[StartingFile], "r" );
    	     else
    	       {
    		  if ( CurrentFile != (FILE *)NULL )
    		     fclose ( CurrentFile );
    		  CurrentFile = (FILE *)NULL ;
    		  return ERROR ;
    	       }
    	  }
     
    	if ( CurrentFile == (FILE *)NULL )
    	   return ERROR ;
         }
     
    /*
    --- Positions itself at the beginning of file
    */
       fseek (CurrentFile, 0L, SEEK_SET);
     
     
    /*
    --- Initializes values
    */
       CurrentLength = Finds_Length_Of_File ();
       CurrentPos = 0 ;
     
       return SUCCESS ;
    }
     
     
    /*
     * P o s i t i o n s _ D a t a b a s e _ T o _ D a t e
     *
     */
    static int Positions_Database_To_Date ( char *DateToFind )
    {
     int Pos, LastStart, StartPos, EndPos ;
     
     
    /*
    --- Checks if database is open. Otherwise opens it
    */
      if ( Opens_Database(DateToFind) == ERROR )
        return (-1) ;
     
    /*
    --- Initializes values
    */
       StartPos = 0 ;
       EndPos = CurrentLength ;
       InitSearch = 1 ;
       LastStart = -1 ;
       SEARCH = True ;
     
       if ( DEBUG )
         fprintf ( stderr, "\n TRIES TO POSITIONS DATABSE TO [%s]", DateToFind);
     
    /*
    --- Then finds the right start by dichotomy ( from an algorithm by Stephane Lachappelle)
    */
       Pos = Finds_Relative_Position ( DateToFind );
       if ( Pos > 0 )
         {
    	while ( ((Pos != 0) || (StartPos != EndPos)) && (CurrentPos < CurrentLength) )
    	  {
    	     if ( Pos < 0 )
    	         EndPos = CurrentPos ;
    	     else
    	         StartPos = CurrentPos ;
     
    	     Pos = (StartPos + EndPos) / 2;
    	     fseek (CurrentFile, Pos, SEEK_SET);
    	     CurrentPos = Pos ;
     
    	     Pos = Finds_Relative_Position ( DateToFind );
    	     if ( (Pos == 0) || (LastStart == CurrentPos))
    		break ;
    	     LastStart = CurrentPos ;
    	  }
     
    	CurrentPos = ftell(CurrentFile);
         }
       else
         {
           Pos = 0 ;
           CurrentPos = 0 ;
         }
     
       fseek (CurrentFile, CurrentPos, SEEK_SET);
       InitSearch = 1 ;
       SEARCH = False ;
     
       if ( DEBUG )
         fprintf ( stderr, " DATABASE POSITIONNED !!!");
     
       return Pos ;
    }
     
     
    /*
     * R e a d s _ D a t a
     *
     */
    static int Reads_Data ( void )
    {
     int   val, cc, mul, qual ;
     float lat, lon ;
     char  Valid[18] ;
     
    /*
    --- Checks if we are at the end of the file
    */
      if ( CurrentPos == CurrentLength )
        return ERROR ;
     
     
       fseek (CurrentFile, CurrentPos, SEEK_SET);
     
    /*
    --- Reads the line
    */
       fgets (Line, 120, CurrentFile) ;
       if ( DEBUG )
         fprintf (stderr, " Reads DATA %s",Line);
       if ( FirstToCheck )
         {
           FirstToCheck = False ;
     
           if ( strncmp(LowDate, Line, strlen(LowDate)) > 0 )
    	 {
    	   CurrentPos = ftell ( CurrentFile);
    	   if ( CurrentPos == CurrentLength )
    	     return ERROR ;
     
    	   fgets (Line, 120, CurrentFile) ;
    	 }
          }
     
    /*
    --- Assigns the values to the structure
    */
        sscanf ( Line, "%17s %f %f %d %d %d %d",
    	   Valid, &lat, &lon, &val, &cc, &mul, &qual );
     
    /*
    --- ICI Stocke les données
    */
    .........
     
     
    /*
    --- Updates the DB position
    */
       CurrentPos = ftell ( CurrentFile);
     
       return SUCCESS ;
    }
    En dehors du code spécifique, notes comment on se positionne n'importe où avec la routine utilisant la recherche dychotomique Positions_Database_To_Date .

    Bien sûr ça n'est qu'un exemple....

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Par défaut
    merci pour ce code je vais l'étudier pour le comprendre car beaucoup de chose m'échappe

Discussions similaires

  1. Ouvrir et écrire dans un fichier .txt en T-SQL
    Par joul's dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 27/10/2008, 21h04
  2. Réponses: 4
    Dernier message: 19/05/2006, 17h06
  3. Date dans un fichier txt
    Par cali1983 dans le forum C++
    Réponses: 6
    Dernier message: 23/05/2005, 17h35
  4. Réponses: 10
    Dernier message: 05/10/2004, 11h28
  5. [langage] tabulation dans un fichier txt
    Par TigreRouge dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2004, 17h36

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