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 :

Lecture fichier TXT


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 74
    Par défaut Lecture fichier TXT
    Bonjour la communauté !
    je suis à la recherche d'idées !

    Le problème est simple mais j'ai du mal à trouver une solution.

    Le but du jeu c'est de lire un fichier TXT, facile, mais le problème c'est qu'il s'agit d'un fichier de trace donc ouvert par un processus qui écrit les évènements à fil de l'eau et que je ne peux pas modifier.

    On m'impose, de créer un processus qui vient lire les évènements enregistrer dans le fichier trace TXT toutes les 10 minutes. Pour les mettre dans une BDD, pour faire par la suite des requêtes/statistiques.

    Je bloque, sur les évènements enregistrer.
    Je vois pas comment faire pour prendre toutes les 10 minutes uniquement que les derniers évènements lors de ma précédente lecture du fichier trace.

    Je ne peux pas écrire dans le fichier de trace, sinon j'aurai mis une balise qui m'aurai fait un point de repère lors de ma précédente lecture du fichier trace.

    Clair ?
    A suivre.....

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    tu enregistre ton offset (ftell() de mémoire), et quand tu rouvre ton fichier tu te poses sur cet offset (fseek() ?).

    un peu de détail ici

    Ca devrais resoudre ton problème.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 74
    Par défaut
    Je pensais prendre la taille du fichier trace qui me permettrai à l'ouverture suivante de repointer l'ancienne taille, et ainsi récupéré les lignes entre l'ancienne et la nouvelle...

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    ouaip, tu fais un coup de ftell quand t as fini ta lecture (tu recuperes l'offset, l endroit ou tu t es arreté), puis lors du passage suivant, apres l ouverture du fichier tu fais un fseek avec l'offset de la lecture precedente, et tu te retrouves la ou tu t etais arreté.

    Ca ne marche que si ton fichier n'est pas purgé.

  5. #5
    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 cstan Voir le message
    Je vois pas comment faire pour prendre toutes les 10 minutes uniquement que les derniers évènements lors de ma précédente lecture du fichier trace.

    Je ne peux pas écrire dans le fichier de trace, sinon j'aurai mis une balise qui m'aurai fait un point de repère lors de ma précédente lecture du fichier trace.
    Tu gères un fichier d'index séparé à coup de ftell()/fseek()

    Sous Windows, ça n'a pas l'air simple. Visiblement, quand un fichier est ouvert en écriture, il ne peut pas être lu (du moins, pas les parties nouvelles...)
    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
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "psleep/inc/psleep.h"
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pthread.h>
     
    #define F_LOG "log.txt"
    #define F_INDEX "index.txt"
     
    void *trace (void *context)
    {
       FILE *fp = fopen (F_LOG, "a");
       if (fp != NULL)
       {
          int i;
          for (i = 0; i < 10; i++)
          {
             char sdate[] = "xxxx/xx/xx xx:xx:xx";
             time_t t = time (NULL);
             struct tm tm = *localtime (&t);
             strftime (sdate, sizeof sdate, "%Y/%m/%d %H:%M:%S", &tm);
             fprintf (fp, "%s\n", sdate);
             {
                int sec = 1 + rand () % 3;
                msleep (1000 * sec);
             }
          }
          fclose (fp), fp = NULL;
       }
       printf ("trace_end\n");
     
       (void) context;
       return NULL;
    }
     
    void *analyse (void *context)
    {
       long ndx = 0;
       /* get the current index */
       {
          FILE *fp = fopen (F_INDEX, "r");
          if (fp != NULL)
          {
             char ligne[32];
             fgets (ligne, sizeof ligne, fp);
             ndx = strtol (ligne, NULL, 10);
             fclose (fp), fp = NULL;
          }
       }
       printf ("ndx=%ld\n", ndx);
     
       /* read the log file every 10 seconds */
     
       {
          int i;
          for (i = 0; i < 4; i++)
          {
             FILE *fp = fopen (F_LOG, "r");
             if (fp != NULL)
             {
                char line[32];
     
                /* skip the beginnig of the file */
                long j = 0;
     
                while (fgets (line, sizeof line, fp) != NULL && j < ndx)
                {
                   j++;
                }
     
                /* display the end of the file */
                while (fgets (line, sizeof line, fp) != NULL)
                {
                   puts (line);
                   j++;
                }
                fclose (fp), fp = NULL;
     
                /* record the last read position */
                {
                   FILE *fp = fopen (F_INDEX, "w");
                   if (fp != NULL)
                   {
                      fprintf (fp, "%ld\n", j);
                      fclose (fp), fp = NULL;
                   }
                }
             }
             msleep (10 * 1000);
          }
       }
       printf ("analyse_end\n");
       (void) context;
       return NULL;
    }
     
    int main (void)
    {
       pthread_t th_trace;
       pthread_t th_analyse;
     
       srand (time (NULL));
     
       pthread_create (&th_trace, NULL, trace, NULL);
       pthread_create (&th_analyse, NULL, analyse, NULL);
     
       pthread_join (th_trace, NULL);
       pthread_join (th_analyse, NULL);
     
       printf ("end\n");
       return 0;
    }
    Je pense qu'il faudrait que le fichier log soit fermé près chaque écriture...

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    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
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "psleep/inc/psleep.h"
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pthread.h>
     
    #define F_LOG "log.txt"
    #define F_INDEX "index.txt"
     
    void *trace (void *context)
    {
       FILE *fp = fopen (F_LOG, "a");
       if (fp != NULL)
       {
          int i;
          for (i = 0; i < 10; i++)
          {
             char sdate[] = "xxxx/xx/xx xx:xx:xx";
             time_t t = time (NULL);
             struct tm tm = *localtime (&t);
             strftime (sdate, sizeof sdate, "%Y/%m/%d %H:%M:%S", &tm);
             fprintf (fp, "%s\n", sdate);
             {
                int sec = 1 + rand () % 3;
                msleep (1000 * sec);
             }
          }
          fclose (fp), fp = NULL;
       }
       printf ("trace_end\n");
     
       (void) context;
       return NULL;
    }
     
    void *analyse (void *context)
    {
       long ndx = 0;
       /* get the current index */
       {
          FILE *fp = fopen (F_INDEX, "r");
          if (fp != NULL)
          {
             char ligne[32];
             fgets (ligne, sizeof ligne, fp);
             ndx = strtol (ligne, NULL, 10);
             fclose (fp), fp = NULL;
          }
       }
       printf ("ndx=%ld\n", ndx);
     
       /* read the log file every 10 seconds */
       int i; /* <===== CAUTION C99 !!! */
       {
          for (i = 0; i < 4; i++)
          {
             FILE *fp = fopen (F_LOG, "r");
             if (fp != NULL)
             {
                char line[32];
                /* skip the beginnig of the file */
     
                long j = 0;
                while (fgets (line, sizeof line, fp) != NULL && j < ndx)
                {
                   j++;
                }
     
                /* display the end of the file */
                while (fgets (line, sizeof line, fp) != NULL)
                {
                   puts (line);
                   j++;
                }
                fclose (fp), fp = NULL;
     
                /* record the last read position */
                {
                   FILE *fp = fopen (F_INDEX, "w");
                   if (fp != NULL)
                   {
                      fprintf (fp, "%ld\n", j);
                      fclose (fp), fp = NULL;
     
                   }
                }
             }
             msleep (10 * 1000);
          }
       }
       printf ("analyse_end\n");
       (void) context;
       return NULL;
    }
     
    int main (void)
    {
       pthread_t th_trace;
       pthread_t th_analyse;
     
       srand (time (NULL));
     
       pthread_create (&th_trace, NULL, trace, NULL);
       pthread_create (&th_analyse, NULL, analyse, NULL);
     
       pthread_join (th_trace, NULL);
       pthread_join (th_analyse, NULL);
     
       printf ("end\n");
       return 0;
    }
    C99 code detected!!!

  7. #7
    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 nicolas.sitbon Voir le message
    C99 code detected!!!
    Exact. J'ai desactivé -ansi pour avoir WIN32...

    Je corrige.

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Exact. J'ai desactivé -ansi pour avoir WIN32...

    Je corrige.
    ne va surtout pas croire que ça me dérange

Discussions similaires

  1. Lecture fichier txt vers tableau alloué
    Par yeboum dans le forum Fortran
    Réponses: 3
    Dernier message: 27/11/2007, 09h31
  2. Lecture fichier TXT
    Par Oncle_Pete dans le forum Delphi
    Réponses: 5
    Dernier message: 16/07/2007, 16h43
  3. lecture fichier txt
    Par stephaneamadeus dans le forum C
    Réponses: 8
    Dernier message: 28/04/2006, 18h47
  4. Lecture fichier txt
    Par licorne dans le forum C
    Réponses: 3
    Dernier message: 03/04/2006, 17h14
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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