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 :

Récupérer une valeur dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut Récupérer une valeur dans un fichier
    Bonjour, je dois pour un exercice de prog en cours recuperer des valeurs dans un fichier log de type IIS ou Apache.

    J'aimerais savoir comment récupérer les différents champs de la ligne, les stocker dans une structure et passer a la ligne suivante.

    Typiquement un algo donnerai :
    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
    CONCIS tab_concis[];
    cpt=0;
    i, j, k =0;
     
     
    Tant que fichier n'est pas à la fin;
    Lire ligne;
    // Extraction des informations de la ligne et classement dans un tableau
     
    // 1ère info = jour au format yyyy-mm-dd
    jour[] = Extraction du jour dans la ligne;
    mise à l'envers du jour : yyyy-mm-dd devient jj-mm-aaaa
    tab_concis[cpt].jour = jour;
     
    // 2ème info = heure au format hh:mm:ss
    heure = Extraction de l'heure dans la ligne;
    tab_concis[cpt].heure = heure; // on conserve le format du log
     
    // 3ème information = IP du visiteur
    ip = extraction de l'ip;
    tab_concis[cpt].ip = ip;
     
    // 4ème information = méthode d'accès a l'url
    methode = Extraction du premier mot après le " ouvrant;
    tab_concis[cpt].methode = methode;
     
    // 5ème information = url
    url = extraction de url;
    tab_concis[cpt].url = url;
     
    // je vous epargne la suite de l'algo
    // a savoir qu'a la fin du trie des elements de la ligne j'incrémente cpt et je dois passer a la ligne suivante
    S'est qu'un extrait mais ça devrai suffire à me faire comprendre le principe de la "chose"

    Si vous avez de la doc, un tuto, un extrait de code ça m'aiderai beaucoup ...

    Vive le Perl ! ! ! !

  2. #2
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    les fonctions fopen, fclose, fgets, sscanf devraient te suffire...


    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Oui, biensure mais comment faire avec ces fonctions pour effectuer la recherche sur la ligne. C'est ça qui me pose problème.

    La ligne est du type :

    217.33.60.213 - - [28/Feb/2002:10:45:24 +0100] "GET /formation/ex_proce_for_1.html HTTP/1.1" 200 657 "www.mirago.fr/scripts/frinfo.asp" "PierreLeRobotMirago"

    ou une autre du type:

    Date IP auth methode URL .....

    Les deux types renvoie à deux format de fichier différents que je dois traité de la même façon ...

    Et parmis ces deux type de lignes vont s'appliquer des filtres différents donc il faut au préalable que je définisse si le fichier et de types un ou deux donc il faut que je donne de l'importance à l'endroit ou je récupère ma variable.

    Du moins dans un premier temps car une fois le type de fichier définis la recupération des valeurs est toujours la même ( même ordre )

    Moi qui n'aime pas le C et qui suis débutant je ne vois pas comment faire cela ...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Si tu dois récupérer des éléments reconnaissables au sein d'une ligne de texte de n'importe quel format, les expressions régulières sont faites pour toi.

    Mais en C, l'API n'est pas forcément compliquée mais quand même un peu délicate. Ne te décourage pas à la première ligne, car c'est un truc qui te servira toute ta vie. :-)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    J'avais pas penser aux expressions régulières. Ca risque de beaucoup m'aider effectivement Je vais regarder ça. MERCI ! ! ! !

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Et si tu veux le faire en C++ avec boost.regex, regarde ici
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    bah il y a encore plus simple...

    Pour discrimner entre les 2 types de fichiers :

    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
    int   Type ;
    char *p1, *p2 ;
     
    p1 = strchr ( Ligne, '.' );
    p2 = strchr ( Ligne, '/' );
     
    if ( p1 < p2 )
        Type = 0 ;
    else
        Type = 1 ;
     
    switch ( Type )
    {
        case 0 :
               sscanf ( Ligne , ...):
               break ;
     
        case 1 :
               sscanf ( Ligne, .... );
               break ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Pour les regex j'ai ecrit ce code :
    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
     
    #include <stdio.h>
    #include <regex.h>
     
    int iis=0;
    int nmatch=1;
     
    int main() {
     
    char *regexiis = "^[:digit:]{4}-[:digit:]{2}-[:digit:]{2}[:space:][:digit:]{2}:[:digit:]{2}:[:digit:]{2}"; // reconnait la date en debut de ligne ==> IIS
    char *lignecapturer = "192.168.1.2 tralalalala lool 192.147 18:954";
     
    int regcomp (regex_t *preg, const char *regexiis, int cflags);
    if (regcomp == 0 ) {
    	int regexec (const regex_t *preg, const char *lignecapturer, size_t nmatch, regmatch_t pmatch[], int eflags);
    	if (pmatch[0]!= NULL) {
    		iis = iis++;
    	}
    }
    else {
    	printf ("size_t regerror (int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)");
    }
    printf (pmatch[0]);
    }
    qui me renvoie les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    regex.c: Dans la fonction «main» :
    regex.c:23: erreur: «pmatch» undeclared (first use in this function)
    regex.c:23: erreur: (Each undeclared identifier is reported only once
    regex.c:23: erreur: for each function it appears in.)
    Je comprends pas ou est le problème :s

    Sinon souviron j'essaie ton code de suite ...

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    heu ... t'espérais pas que cela allait compiler dans cet état tout de même ?

    Tu as cherché des exemples d'utilisation ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par sebbb59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int regcomp (regex_t *preg, const char *regexiis, int cflags);
    if (regcomp == 0 ) {
    	int regexec (const regex_t *preg, const char *lignecapturer, size_t nmatch, regmatch_t pmatch[], int eflags);
    
    Je comprends pas ou est le problème :s
    Tu as fait un copier-coller des prototypes des fonctions que tu veux utiliser. Ce n'est pas comme ça que le C fonctionne. Lorsque que tu appelles une fonction, tu écris simplement son nom, sans le précéder du type (que l'on ne précise qu'aux moments où l'on déclare ou définit la fonction), puis l'on passe les paramètres entre parenthèses. Ces paramètres correspondent à des variables que tu dois avoir déclarées elles-aussi. Et, là encore, on ne précise pas le type au moment de l'utilisation.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 19
    Points
    19
    Par défaut
    Oups ... comme quoi je suis dans la bonne section ... Debuter ^^ même si le niveau de l'exo ne correspond pas au mien je crois ...

    Voilà j'ai modifié le code qui donne :

    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
    #include <stdio.h>
    #include <regex.h>
     
    int iis=0;
    int flag;
    size_t nbr_match=1;
    regmatch_t tab_match[];
    regex_t *comp_reg;
    const char *regexiis = "^[:digit:]{4}-[:digit:]{2}-[:digit:]{2}[:space:][:digit:]{2}:[:digit:]{2}:[:digit:]{2}"; // reconnait la date en debut de ligne ==> IIS
    char *lignecapturer = "2008-12-10 12:45:20 192.168.1.2 tralalalala lool 192.147 18:954";
     
    int main() {
     
     
    if (regcomp (comp_reg, regexiis, flag) == 0 ) {
    	regexec (comp_reg, lignecapturer, nbr_match, tab_match, flag);
     
    }
    printf ("valeure : %s , iis : %d", tab_match[0], iis);
    }
    Quand je comprile j'ai le message :

    regex.c:15: attention : array «tab_match» assumed to have one element

    et quand j'execute ça me dit : Erreur de segmentation

    J'ai mis size_t nbr_match=1 parceque je suis cencé capturer un élément dans la ligne et l'erreur doit se réferer à cette variable mais je sais pas comment la corriger ...

Discussions similaires

  1. récupérer une valeur dans un fichier
    Par yoyo-tns dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 26/07/2012, 10h20
  2. Récupérer une valeur dans un fichier.
    Par Playstate dans le forum Débuter
    Réponses: 3
    Dernier message: 20/11/2011, 13h17
  3. récupérer une valeur dans un fichier
    Par fbb53 dans le forum Shell et commandes GNU
    Réponses: 38
    Dernier message: 19/07/2011, 08h58
  4. Réponses: 0
    Dernier message: 25/02/2008, 14h23
  5. récupérer une valeur dans un fichier .txt ?
    Par _n1n1_ dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/04/2007, 19h19

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