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 :

probleme avec popen


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Points : 3
    Points
    3
    Par défaut probleme avec popen
    bonjour
    j'ai un petit probleme avec la fonction popen, je me demandais si il y'avait pas un moyen pour inclure une variable dans le premier parametre de cette fonction .
    je m'explique j'ai un fichier sous unix sous la forme suivante

    toto1: 1 2 3 4 1
    toto2: 1 3 5 7 9
    ........
    toto11:0 2 4 1 1

    je souhaite ecrire un code en c qui permet de recuperer toutes les lignes
    " rien que les entiers " du fichier unix pour les stocker dans un tableau que je vais manipuler par la suite .

    voila ce que je suis arrivé a faire ( je suppose que mon fichier ne contiens que toto 1 ,2 et toto3)
    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
     
    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>
    # define LNG_MAX  20
    # define LAR_MAX  20
    # define ATTOUL 1000
    # define SEP ""
     
    /// 
     
    static void clean (char *chaine) ;
     
    ////
     
    int main ( int argc ,  char* argv[] )
     {
            int i = 0 ;
               int j = 0 ;
                  FILE* flot = NULL ;
                       int tab[LNG_MAX][LAR_MAX] ;
    		      char  put_here [ATTOUL] = "";
                            char* token = NULL ;
     
     
       /** initialisation du tableau **/
     
      for ( i =0 ; i< LNG_MAX ; i++)
       {
           for ( j =0 ; j< LAR_MAX ; j++)
             {
    		tab[i][j] = 0 ;
              }
        }
     
      /** reinitialisation des variables i et j a cause de l’incremantation **/
     
      i = 0 ;
        j = 0 ;
     
     
      /** recuperation des données a partir du fichier unix **/
     
      flot = popen ("  grep toto1 /var/sum ", " r ") ;
        flot = popen ("  grep toto2 /var/sum ", " r ") ;
          flot = popen ("  grep toto3 /var/sum ", " r ") ;
     
     
     
      /** verification de l’adresse retourné par popen**/
     
          if ( flot == NULL )
                  {
                      printf ("  echec process ") ;
                          break ;
                    }
     
     
      /** lecture du flot ligne par ligne **/
     
        while ( !feof (flot) && i< LNG_MAX )
     
            {   
                 /** je recupere chaque ligne pour la stocker dans le tableau chaine **/
     
                 fgets ( put_here,sizeof(put_here),flot);
     
                       /** je supprime le "\n" et vide mon stdin **/
     
                       clean ( put_here);
     
                              /** je decoupe ma ligne selon le caractere espace "  " **/
     
                                token = strtok (put_here,SEP);    
     
                                   /** convertion en entier &Implementation du tableau**/
     
                                      while ( token!=NULL && j< LAR_MAX )
     
                                        { 
    				       tab[i][j] = atoi(token);
     
     
                                           		j++;
                                         }
    	 i++ ;
     
      pclose(flot);
     
         }
     
      return 0 ; 
     
    }
     
     
    /*************** fonction clean************/
     
    static void purger(void)
    {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF)
        {}
    }
     
    static void clean (char *chaine)
    {
        char *p = strchr(chaine, '\n');
        int c;
     
        if (p)
        {
            *p = 0;
        }
     
        else
        {
            purger();
        }
    }
     
     
     
     
     
     
     
     
     
     
    
    merci à toutes les bonnes ames qui voudront me repondre.

  2. #2
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Pourquoi n'ouvres-tu pas directement ton fichier avec fopen()? Le code ci-dessous te convient-il?

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define LNG_MAX  20
    #define LAR_MAX  20
    #define ATTOUL 1000
    #define SEP " "
     
    static void fclean(char *chaine, FILE *fp);
     
    int main (void)
    {
        int err = EXIT_SUCCESS;
        FILE* flot = NULL;
     
        flot = fopen("/var/sum", "r") ;
     
        if ( flot != NULL )
        {
            int i = 0;
            int j = 0;
            int tab[LNG_MAX][LAR_MAX] = {0};
            char  put_here[ATTOUL] = "";
            char* token = NULL ;
     
            while (i < LNG_MAX && fgets(put_here, sizeof put_here, flot) != NULL)
            {
                fclean(put_here, flot);
     
                token = strtok(put_here, SEP);
     
                while ((token = strtok(NULL, SEP)) != NULL && j < LAR_MAX)
                {
                    tab[i][j] = strtol(token, NULL, 0);
                    ++j;
                }
                if (token != NULL && j == LAR_MAX)
                {
                    fprintf(stderr, "Avertissement: des entiers n'ont pu être saisis dans le tableau!\n");
                }
                ++i;
            }
     
            if (i == LNG_MAX && feof(flot) == 0)
            {
                fprintf(stderr, "Avertissement: des donnees n'ont pas pu être lues!\n");
            }
     
            fclose(flot), flot = NULL;
        }
        else
        {
            fprintf(stderr, "echec ouverture du fichier") ;
            err = EXIT_FAILURE;
        }
     
        return err;
    }
     
    static void fclean(char *chaine, FILE *fp)
    {
        char *p = strchr(chaine, '\n');
     
        if (p != NULL)
        {
            *p = 0;
        }
        else
        {
            int c;
     
            while ((c = fgetc(fp)) != '\n' && c != EOF)
            {
            }
        }
    }
    Thierry

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    Je ne comprends pas le début du code, je ne pense pas qu'il soit nécessaire de nommer des arguments dans le prototype de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define LNG_MAX  20
    #define LAR_MAX  20
    #define ATTOUL 1000
    #define SEP " "
     
    static void fclean(char *chaine, FILE *fp);
    Je crois que pour déclarer le prototype de la fonction, cela s'écrit comme ça, sans déclarer d'arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void fclean(char *, FILE *);
    , et que cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void fclean(char *chaine, FILE *fp)
    est réservée à la définition avec le code de la fonction qui
    suit :
    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
     
    {
    char *p = strchr(chaine, '\n');
     
        if (p != NULL)
        {
            *p = 0;
        }
        else
        {
            int c;
     
            while ((c = fgetc(fp)) != '\n' && c != EOF)
            {
            }
        }
    }

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ce n'est pas nécessaire, mais pas dangereux non plus.
    Et ça a des avantages quand tu utilises un EDI avec une bibliothèque: L'EDI peut afficher dans une info-bulle le nom des paramètres en plus de leur type, après les avoir lus dans le prototype...

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    bonjout
    le probleme c que fichier ne contient pas que les " toto" il comprend d'autres données que je veux pas utiliser, donc si j'utilise grep c pour simplifier un peu mon code .

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Rien ne t'empêche de construire dynamiquement la chaîne de caractère contenant la commande que tu souhaites éxécuter.
    malloc + strcat ou autre.
    cf le man pour plus de détails.


    <edit>
    L'indentation de ton code est particulièrement horrible.

Discussions similaires

  1. probleme avec popen
    Par jmathon dans le forum Linux
    Réponses: 5
    Dernier message: 02/05/2007, 11h30
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 11h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 23h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 08h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 09/06/2002, 00h06

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