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 :

Rechercher Chaine variable dans fichier variable


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut Rechercher Chaine variable dans fichier variable
    Bonjour,

    Je souhaiterai récupérer dans des variables des chaines de caractères dans un fichier. Mais le hic est que ces chaines sont variables.

    Contenu du fichier (par exemple) :
    blablablabla
    blablablabla

    MaChaineFixeTemoin MaChaine1Variable MaChaine2Variable

    blablabla
    blabla
    blebleblebleble
    blibliblibliblibli
    En fait, la seule chaine qui ne varie pas est MaChaineFixeTemoin.

    J'aimerai récupérer MaChaine1Variable et MaChaine2Variable
    Là suis perdu.
    Pour info, le fichier est un fichier dont les données varient dans le temps.

    Merci pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Si je comprends bien ta question, tu veux récupérer uniquement la ligne (une seule au maximum) qui commence par "MaChaineFixeTemoin" ?

    Il suffit de :
    1) ouvrir ton fichier en lecture et en mode texte, et vérifier si cela n'a pas échoué
    2) début boucle :
    3) récupérer la ligne courante avec fgets dans un buffer. On sort de la boucle si la fonction échoue.
    4) scanner la chaine avec sscanf. Si la conversion a réussi, on sort de la boucle. Code à adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (sscanf(buffer , "MaChaineFixeTemoin %s %s" , chaine1 , chaine2) == 2)
    {
       printf("Chaine 1 : %s\nChaine 2 : %s\n" , chaine1 , chaine2);
    }
    5) fin boucle

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    sscanf() ? hmm pas ce qu'il y a de mieux. Plutot un strncmp() pour trouver la ligne correspondante et ensuite on récupère les 2 autres chaines de charactères avec des strtok().

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    sscanf() ? hmm pas ce qu'il y a de mieux. Plutot un strncmp() pour trouver la ligne correspondante et ensuite on récupère les 2 autres chaines de charactères avec des strtok().
    Il y a bien entendu plusieurs méthodes. Avec sscanf, ça ne tient qu'en une seule ligne.

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    sscanf() ? hmm pas ce qu'il y a de mieux...
    Que reprochez-vous exactement à sscanf() ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    En fait c'est juste les 2 chaine variables que j'ai besoin et je ne vois pas comment mais avec tes infos je vais essayer, ça donne déja un petit aperçu de ce que je devrais faire.
    Merci
    Et comme je ne suis pas fortiche en programmation.... C'est pas mon boulot

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Là moi suis largué !!

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ben les deux chaines récupérées sont chaine1 et chaine2 (dans mon exemple).

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Merci
    Je récupère maintenant correctement mes Chaines de caractères.

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Je viens de découvrir un nouveau pb auquel je n'avais pas pensé avant.
    Il se trouve que le fichier dans lequel je vais chercher les variables n'a pas toujours la même forme.
    Sur un PC, il va être de la forme
    Statistiques depuis 5/19/2011 1:32 PM
    et sur un autre PC il sera de la forme
    Statistiques depuis 5/19/2011 13:32
    De coup le fait d'avoir 3 variables sur un PC et 2 sur un autre, ça fait planter le programme.
    Comment faire pour gérer ces 2 cas de figure ?
    Merci pour votre aide.

    Voici le code de ma fonction.
    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
     
    int RecuperationDernierReboot(char* s_filename)
    {
      FILE * p_file = NULL;
      char * s_line = NULL;
      char done = 0;
      char* Date=malloc(sizeof(char)*10);
      char* Heure=malloc(sizeof(char)*5);
      char* TypeHeure=malloc(sizeof(char)*2);
     
      DateDernierReboot=malloc(strlen(Date)+strlen(Heure)+strlen(TypeHeure)+2+1);
     
     
       /* ----- Ouverture du fichier ----- */
       p_file = fopen (s_filename, "r");
     
       if (!p_file)
       {
          /* Erreur: impossible d'ouvrir le fichier. */
          return FALSE;
       }
     
       /* ----- Allocation du buffer temporaire ----- */
       s_line = malloc (BUFSIZ);
     
       if (!s_line)
       {
          /* Erreur: impossible d'allouer l'espace requis. */
          fclose (p_file);
          return FALSE;
       }
     
     
       while (fgets (s_line, BUFSIZ, p_file))
       {
          /* Suppression du caractère de saut de ligne */
          char * p = strchr(s_line, '\n');
          if(p != NULL)
          {
             *p = 0;
          }
     
     
     
          /* Recherche de la chaine à traiter */
          if(sscanf(s_line , "Statistiques depuis %s %s %s", Date , Heure, TypeHeure)==3)
          {
              /* La chaine a été trouvée, on sort. */
              done = 1;
              break;
          }
     
          memset (s_line, 0, sizeof (s_line));
       }
     
     
       /* Fermeture du fichier. */
       fclose (p_file);
     
       /* Liberation du buffer. */
       free (s_line);
       s_line = NULL;
     
     
      if(strcmp(DebugMode, "3")==0)
      {
          INFO2("Date=%s", Date);
          INFO2("Heure=%s", Heure);
          INFO2("TypeHeure=%s", TypeHeure);
      }
     
      sprintf(DateDernierReboot, "%s %s %s", Date, Heure, TypeHeure);
     
      free(Date);
      free(Heure);
      free(TypeHeure);
    }
    Le pb se trouve donc ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          if(sscanf(s_line , "Statistiques depuis %s %s %s", Date , Heure, TypeHeure)==3)
    Il faudrait (je pense) que le programme découvre qu'il y a soit 2 soit 3 champs à récupérer mais je ne vois pas comment.

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le plus simple est de convertir systématiquement dans un seul format les heures avant de faire la comparaison.
    Dans l'exemple qui suit, les heures sont converties en format 24h :
    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
    int conversion24Heures(char * s_line, char * dest)
    {
      char Date[11];
      int Heure;
      char Minute[4];
      char TypeHeure[3]= {0};
      int  Ok = 1;
      int i = sscanf(s_line , "%*[^0-9]%s %d %s %s", Date , &Heure, Minute, TypeHeure);
      // Dans le cas où aucun texte ne précède la date/heure, le %*[^0-9] du sscanf() précédent a échoué.
      // Alors on recommence
      if(i==0) i = sscanf(s_line , "%s %d %s %s", Date , &Heure, Minute, TypeHeure);
      switch(i)
      {
        case 4 :  //format 12h : conversion en 24h
                  if(strcmp(TypeHeure,"AM")==0 || strcmp(TypeHeure,"am")==0)
                  {
                    if(Heure ==12) Heure = 0;
                  }
                  else if(strcmp(TypeHeure,"PM")==0 ||strcmp(TypeHeure,"pm")==0)
                       {
                         if(Heure != 12) Heure += 12;
                       }
                       else Ok = 0; //erreur
        case 3 :  //format 24h
                  break;
        default : Ok = 0; //erreur
      }
      //Ecriture en format 24h
      if(Ok) sprintf(dest, "%s %02d%s", Date, Heure,Minute);
      else dest[0] = '\0';
      return Ok;
    }
    Fonction utilisable comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(void)
    {
      char tab[] = "Statistiques depuis 12/08/2010 12:32 AM";
      char dest[17];
      int valide = conversion24Heures(tab,dest);
      if(valide )printf(">%s<",dest);
      else printf("Erreur");
      return 0;
    }
    //Affichage : >12/08/2010 00:32<

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Merci pour cette solution.
    En fait, j'ai tout simplement fait ceci qui permet de corriger mon pb.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      if((strcmp(TypeHeure,"AM")==0) || (strcmp(TypeHeure,"PM")==0))
      {
          sprintf(DateDernierReboot, "%s %s %s", Date, Heure, TypeHeure);
      }
      else
      {
          sprintf(DateDernierReboot, "%s %s", Date, Heure);
      }
    Qu'en pensez-vous ?

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

Discussions similaires

  1. passer une chaine contenu dans une variable en nom de variable
    Par spiro13 dans le forum Général Python
    Réponses: 5
    Dernier message: 25/04/2007, 12h14
  2. [débutant] récupérer variables dans fichier
    Par guigui32 dans le forum Langage
    Réponses: 2
    Dernier message: 30/11/2006, 11h03
  3. Détection de chaines types dans une variable.
    Par boss_gama dans le forum ASP
    Réponses: 5
    Dernier message: 15/09/2006, 14h27
  4. [9i] Bind variable dans fichier trace
    Par learn dans le forum Oracle
    Réponses: 6
    Dernier message: 27/01/2006, 15h24
  5. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 11h55

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