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 des data avec system() [Débutant(e)]


Sujet :

C

  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut Récupérer des data avec system()
    Bonjour,

    J'ai un petit code qui génére une commande snmp pour récupérer des informations d'une MIB.
    Je génere ma commande par plusieurs strncat() puis une fois la totalité de ma commande formatée je l'envoie par system()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    strcpy(Cmd,CmdSnmp);     
    strcat(Cmd,IP);                          
    strcat(Cmd,TireC);                       
    strcat(Cmd,COM);                         
    strcat(Cmd,WALK);                        
    strcat(Cmd,CpcimgObjMame);               
    system(Cmd);
    Mon programme fonctionne, je récupére les données dans un fichier vers la sortie standard SDTOUT dirigé dans un fichier.
    Suite à ma commande snmp je récupére plusieurs enregistrements de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    13.4.5.0.42.2.0.1.0.6360144 = '4d41300a4d5a303100'h
    13.4.5.0.42.2.0.1.0.6350174 = '4d41350a4d5a303900'h
    Cependant, je souhaiterai mettre toutes ses données dans un tableau de type char[].

    Je ne vois vraiment pas comment faire, est-ce possible ?,si oui quelle est la technique ?

  2. #2
    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 SPACHFR Voir le message
    je récupére les données dans un fichier vers la sortie standard SDTOUT dirigé dans un fichier.
    Suite à ma commande snmp je récupére plusieurs enregistrements de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    13.4.5.0.42.2.0.1.0.6360144 = '4d41300a4d5a303100'h
    13.4.5.0.42.2.0.1.0.6350174 = '4d41350a4d5a303900'h
    Cependant, je souhaiterai mettre toutes ses données dans un tableau de type char[].

    Je ne vois vraiment pas comment faire, est-ce possible ?,si oui quelle est la technique ?
    En gros, tu dois lire un fichier texte, c'est ça ? C'est pas écrit dans ton livre de C ?

  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    je me suis mal exprimé
    Actuellement je génere ce fichier résultat de la commande snmp envoyé via l'instruction system().
    ça fonctionne très bien, j'arrive à manipuler ce fichier comme je le souhaite

    Simplement je voulais savoir si au lieu de récuprer ces informations dans un fichier, je pouvais directement récupérer chaque enregistrement dans un tableau de char[].
    Je ne sais pas si c'est possible (j'ai pas trouvé d'infos), est si oui quelle technique utiliser ?

  4. #4
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    il y a deux solutions :

    1. soi tu laisse comme ça et tu relis le fichier généré pour stocker ce qu'il contient dans un tableau
    2. soit tu met en place un tube pour que la sorti de ta commande soit un char* et non un fichier texte

  5. #5
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Citation Envoyé par Laughing Man Voir le message
    il y a deux solutions :

    1. soi tu laisse comme ça et tu relis le fichier généré pour stocker ce qu'il contient dans un tableau
    c'est ce que je fais actuellement, c'est la solution la plus simple (pour moi qui débute). Mais en prevision, d'une future évolution de mon pgm, je préférerai avoir directement un tableau[] avec les enregistrements

    Citation Envoyé par Laughing Man Voir le message
    il y a deux solutions :

    2. soit tu met en place un tube pour que la sorti de ta commande soit un char* et non un fichier texte
    Un tube, c'est quoi ?..

  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 SPACHFR Voir le message
    Un tube, c'est quoi ?..
    Une extension supportée par certains systèmes. (pipe).

    Ca permet de brancher la sortie standard d'un programme sur l'entrée standard d'un autre.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Par défaut
    Exemple utilisant la fonction popen() (pipe)
    associée à un tableau de structures alloué dynamiquement.

    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
     
    // test.c
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct 
    {
      int  index;
      char data[80];
    } ELEMENT;
     
    int main(void)
    {
      char     buf[80];
      FILE    *p = NULL;
      ELEMENT *e = NULL;
      int      n = 0, i = 0;  
     
      //Execution de la commande (pipe) 
      if((p = popen("type test.c", "r")))
      {
        //Lecture du resultat ligne par ligne  
        while(fgets(buf, sizeof buf, p))
        {
          //Suppression du caractere '\n'
          buf[strlen(buf)-1] = 0; 
          //Allocation d'une structure par ligne lue
          if((e = (ELEMENT *)realloc(e, (i+1) * sizeof(ELEMENT))))
          {
            //Affectation des donnees a la structure
            e[i].index = i;
            strcpy(e[i].data, buf);
            //Incrementation         
            n = i++;
          }
        }
        pclose(p);
      }
     
      // Affichage du tableau de structures
      for(i = 0; i < n; i++)  
        printf("%3d  %s\n",  e[i].index, e[i].data);
     
      free(e);     
      return 0;
    }

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par magma² Voir le message
    Exemple utilisant la fonction popen() (pipe)
    Il manque l'inclusion de string.h. Et je precise que popen() et le contenu de la chaine de caractere envoyee a system() sont non standard.

  9. #9
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Merci pour vos réponses, je vais prendre le temps de comprendre ce code (je débute en C)
    Pour le coté standard de la chaine retournée, l'important est que je puisse exploiter ces données. Ce programme est destinée à fonctionner uniquement dans l'unix services d'un z/OS sur mainframe.

  10. #10
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    je precise que popen() et le contenu de la chaine de caractere envoyee a system() sont non standard.
    J'ai essayé l'utilisation de popen() (exemple simple trouvé sur le net), mais lors de ma compilation j'ai les messages suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    The name lookup for "popen" did not find a declaration. 
    The name lookup for "pclose" did not find a declaration.
    le source
    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
     
    #include <stdio.h>                                                 
    #include <stdlib.h>                                                
    #include <string.h>                                                
    int main(void) {                                                   
    FILE * tube;                                                       
    char donnees[30];                                                  
     
    if((tube = popen("df -k", "r")) != NULL)                           
    /* creation tube et lancement de la commande df -k dont on lira le 
    resultat depuis le tube*/                                          
     { while (fgets(donnees, 30, tube) != NULL)                        
     /* lecture dans le tube */                                        
       {                                                                
         printf("voici 30 car lus a partir du tube : %s\n", donnees);   
       }                                                                
     }                                                                  
     else {
       perror("erreur creation pipe");                               
       }
     pclose(tube);  /* fermeture du tube, terminaison de la commande */ 
     return(0);
     }
    Je suppose qu'il manque un header (?), ou suis je dans le cas du non standard (instruction popen() non supportée par l'OS sur lequel je compile ce source ?

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    Je suppose qu'il manque un header (?), ou suis je dans le cas du non standard (instruction popen() non supportée par l'OS sur lequel je compile ce source ?
    popen() est POSIX.1, pas C90 (pour une raison que je ne m'explique pas vraiment, certaines plateformes mettent quand meme son prototype dans stdio.h). Verifie que tu n'exiges pas une compatibilite absolue avec C90 (genre -ansi ou -std=c90 pour gcc). Si tu fais cela, toutes les fonctions non-standard ne sont pas accessibles.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Donc en théorie, popen() devrait être déclaré dans unistd.h ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    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 Médinoc Voir le message
    Donc en théorie, popen() devrait être déclaré dans unistd.h ?
    Non. La théorie dit :
    Citation Envoyé par POSIX.1
    The Single UNIX ® Specification, Version 2
    Copyright © 1997 The Open Group
    NAME

    popen - initiate pipe streams to or from a process

    SYNOPSIS



    #include <stdio.h>

    FILE *popen(const char *command, const char *mode);
    <...>
    C'est donc bien <stdio.h>

  14. #14
    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 DaZumba Voir le message
    popen() est POSIX.1, pas C90 (pour une raison que je ne m'explique pas vraiment, certaines plateformes mettent quand meme son prototype dans stdio.h)<...>
    Parce qu'elles sont conformes à POSIX.1, tout simplement !

    http://opengroup.org/onlinepubs/0079...xsh/popen.html

  15. #15
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non. La théorie dit :

    C'est donc bien <stdio.h>
    Effectivement, j'ai bien retrouvé ces informations dans le "run time library référence" pour z/OS.

    #define _XOPEN_SOURCE
    #include <stdio.h>
    FILE *popen(const char *command, const char *mode);

    Avec dependencies POSIX(ON).

    Malgrès ajout dans le code du '#define _XOPEN_SOURCE' , j'ai le même problème (??). Je cherche toujours....

  16. #16
    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 SPACHFR Voir le message
    Effectivement, j'ai bien retrouvé ces informations dans le "run time library référence" pour z/OS.
    #define _XOPEN_SOURCE
    #include <stdio.h>
    FILE *popen(const char *command, const char *mode);

    Avec dependencies POSIX(ON).
    Malgrès ajout dans le code du '#define _XOPEN_SOURCE' , j'ai le même problème (??). Je cherche toujours....
    C'est pas dans le code qu'il faut l'ajouter, mais sur la ligne de commande du compilateur avec l'option -D :
    (ou équivallent avec ton compilateur).

    Ou plus exactement, réaliser ceci :
    Avec dependencies POSIX(ON).
    comme indiqué dans ta doc.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/06/2008, 10h52
  2. Récupérer des Map avec les Criteria
    Par Asterius dans le forum Hibernate
    Réponses: 2
    Dernier message: 03/01/2008, 12h17
  3. récupérer des URL avec Regexp
    Par manu00 dans le forum Langage
    Réponses: 3
    Dernier message: 28/07/2007, 18h39
  4. récupérer le résultat avec "system()"
    Par kboo dans le forum MFC
    Réponses: 12
    Dernier message: 09/06/2006, 10h50
  5. [VB.NET] [ODBC] Récupérer des valeurs avec requête ODBC?
    Par Pleymo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/03/2005, 16h38

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