begin process at 2012 05 30 06:24:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Linux

 > 

Fichier & Disque

 > 

récupérer en C++ le résultat d'une commande


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

récupérer en C++ le résultat d'une commande

vendredi 15 septembre 2006 à 13:41:48 | récupérer en C++ le résultat d'une commande

chotana

Salut,

je cherche
1- à parcourir tous les sous répertoire à partir d'un répertoire de départ
2- rechercher tous les fichiers .config
3- pour chaque fichier l'ouvrir et regarder s'il y a le mot clé TRUC
4- si le mot clé est présent alors afficher le chemin+nom du fichier
5- récupérer la liste des fichiers en C++

voici mon souci : en shell je fais
for i in `find . -name .config` ;do
    if cat $i |grep TRUC ;
    then echo $i;
    fi  ;
done

Ca marche, j'obtient 2 lignes pour chaque fichier :
1- une ligne qui contient le mot clé
2- une ligne qui contient le chemin+nom du fichier

Mon pb est d'exécuter cette commande en C++ et de récupérer le résultat dans un tableau

Qui peut m'aider ?

Merci


vendredi 15 septembre 2006 à 14:38:45 | Re : récupérer en C++ le résultat d'une commande

buno

Administrateur CodeS-SourceS
Je ne suis pas sûr de moi, à vérifier et à tester donc, mais je crois que:
- tu mets ton code dans un fichier bat
- pour lancer le bat, tu utilise CreateProcess() (voir MSDN)
- cette fonction prend en paramètre une structure STARTUPINFO dans laquelle tu spécifie les différentes sorties (entrée, sortie, erreur)
- une fois que le process est fini (et c'est là que je ne suis pas certain), tu dois avoir moyen de récupérer la sortie, dans laquelle s'est affiché ton résultat, et tu peux la parser.

Sinon, et c'est ce que je te conseille, tu peux utiliser l'API Windows: FindFirstFile(), FindNextFile() pour parcourir un répertoire. Après, manipulation classique de fichiers.

En espérant d'avoir aidé

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
vendredi 15 septembre 2006 à 14:42:17 | Re : récupérer en C++ le résultat d'une commande

chotana

oulah !

ca m'a l'air bien compliqué tout ça ; je pense qu'avec popen je pourrais arriver à récupérer le flux, mais je ne vois pas très bien comment.

Au fait, je travaille sous Linux, pas sous Windows

vendredi 15 septembre 2006 à 14:53:13 | Re : récupérer en C++ le résultat d'une commande

buno

Administrateur CodeS-SourceS
M'en serais douté
Désolé mais mon aide s'arrête là...
Ceci dit, tu peux transcrire ton code shell en C++

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
vendredi 15 septembre 2006 à 14:55:35 | Re : récupérer en C++ le résultat d'une commande

buno

Administrateur CodeS-SourceS
Ah oui, désolé! Je n'avais pas lu l'endroit où tu avais posté (Thèmes / C++ & C++ .NET / Linux /...)
Au temps pour moi...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
vendredi 15 septembre 2006 à 14:57:23 | Re : récupérer en C++ le résultat d'une commande

chotana

de rien, mais ça n'arrange pas mes affaires

j'aurais voulou éviter de faire tout ça en C++ d'autant que le shell le fait très bien en une ligne de commande ....

vendredi 15 septembre 2006 à 15:00:59 | Re : récupérer en C++ le résultat d'une commande

buno

Administrateur CodeS-SourceS
Je viens de faire une recherche sur le site et j'ai trouvé ceci:
http://www.cppfrance.com/infomsg_EXECUTER-COMMANDE_802853.aspx
ça peut peut-être t'aider, non?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
vendredi 15 septembre 2006 à 15:01:43 | Re : récupérer en C++ le résultat d'une commande

buno

Administrateur CodeS-SourceS
Avec le lien:
http://www.cppfrance.com/infomsg_EXECUTER-COMMANDE_802853.aspx

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
samedi 16 septembre 2006 à 02:32:51 | Re : récupérer en C++ le résultat d'une commande

AlexN

Chez moi ça n'affiche rien...
Si tu oublies l'option -print de find, find n'affichera pas de résultat
find . -name .config -print
l'instruction if n'accepte de tester que des expressions entières, et grep renvoie des chaines de caractères.

for i in `ls -a *.config`; do
    if [[ `grep TRUC $i | wc -l` -ne 0 ]];
    then echo $i;
    fi;
done

version c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

void usage (char *argv[]) {
    printf ("Usage : %s MotAChercher RepertoireDeRecherche ExtensionDeFichier\n", *argv);
    exit (EXIT_SUCCESS);
}
void erreur (char *err, char *f) {
    char msg[100];
    sprintf (msg, "%s %s", err, f);
    perror(msg);
    exit (EXIT_FAILURE);
}

int main(int argc, char *argv[]) {

    FILE *f;
    DIR *dir;
    struct dirent *d;
    char *ext, *mot, *buf;
    char p[PATH_MAX+1+256+1];
    size_t t;
   
    if ( argc != 4 ) usage(argv);
    if ( !(ext = (char *) malloc (strlen(argv[3]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
    strcpy (ext, argv[3]);
    if ( !(mot = (char *) malloc (strlen(argv[1]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
    strcpy (mot, argv[1]);
    // Ouvrir le repertoire
    if ( !(dir = opendir(argv[2])) ) erreur ("Problème pour ouvrir le répertoire", argv[2]);
        // Parcourir les entrées du repertoire
        while ( (d = readdir(dir)) )
            if ( strstr(d->d_name, ext) ) {
                // Contruire le chemin du fichier
                strcpy (p, argv[2]);
                if ( *argv[2]+strlen(argv[2]) != '/' ) strcat (p, "/");
                strcat (p, *(d->d_name) == '/' ? d->d_name+1 : d->d_name);
                // Ouvrir le fichier en lecture
                if ( !(f = fopen (p, "r")) ) erreur("Problème pour ouvrir en lecture le fichier", d->d_name);   
                if ( fseek(f, 0L, SEEK_END) == -1 ) { perror("fseek"); exit (EXIT_FAILURE); }
                if ( (t = ftell(f)) == -1 ) { erreur("Fichier trop gros :", d->d_name); exit (EXIT_FAILURE); }
                rewind(f);
                // Chercher le mot
                if ( !(buf = (char *) malloc (t)) ) { perror("malloc"); exit (EXIT_FAILURE); }
                if ( !fread (buf, t, 1, f) )  { perror("fread"); exit (EXIT_FAILURE); }
                if ( strstr(buf, mot) ) { puts(p); }
                if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", d->d_name);
            }
    if ( closedir(dir) == -1 ) erreur ("Problème pour fermer le répertoire", argv[2]);
    return EXIT_SUCCESS;
}

samedi 16 septembre 2006 à 03:43:12 | Re : récupérer en C++ le résultat d'une commande

AlexN

Il manquait une ligne :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

void usage (char *argv[]) {
    printf ("Usage : %s MotAChercher RepertoireDeRecherche ExtensionDeFichier\n", *argv);
    exit (EXIT_SUCCESS);
}
void erreur (char *err, char *f) {
    char msg[100];
    sprintf (msg, "%s %s", err, f);
    perror(msg);
    exit (EXIT_FAILURE);
}

int main(int argc, char *argv[]) {

    FILE *f;
    DIR *dir;
    struct dirent *d;
    char *ext, *mot, *buf;
    char p[PATH_MAX+1+256+1];
    size_t t;
   
    if ( argc != 4 ) usage(argv);
    if ( !(ext = (char *) malloc (strlen(argv[3]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
    strcpy (ext, argv[3]);
    if ( !(mot = (char *) malloc (strlen(argv[1]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
    strcpy (mot, argv[1]);
    // Ouvrir le repertoire
    if ( !(dir = opendir(argv[2])) ) erreur ("Problème pour ouvrir le répertoire", argv[2]);
        // Parcourir les entrées du repertoire
        while ( (d = readdir(dir)) )
            if ( strstr(d->d_name, ext) ) {
                // Contruire le chemin du fichier
                strcpy (p, argv[2]);
                if ( *argv[2]+strlen(argv[2]) != '/' ) strcat (p, "/");
                strcat (p, *(d->d_name) == '/' ? d->d_name+1 : d->d_name);
                // Ouvrir le fichier en lecture
                if ( !(f = fopen (p, "r")) ) erreur("Problème pour ouvrir en lecture le fichier", d->d_name);   
                if ( fseek(f, 0L, SEEK_END) == -1 ) { perror("fseek"); exit (EXIT_FAILURE); }
                if ( (t = ftell(f)) == -1 ) { erreur("Fichier trop gros :", d->d_name); exit (EXIT_FAILURE); }
                rewind(f);
                // Chercher le mot
                if ( !(buf = (char *) malloc (t)) ) { perror("malloc"); exit (EXIT_FAILURE); }
                if ( !fread (buf, t, 1, f) )  { perror("fread"); exit (EXIT_FAILURE); }
                if ( strstr(buf, mot) ) { puts(p); }
                if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", d->d_name);
                free(buf);
            }
    if ( closedir(dir) == -1 ) erreur ("Problème pour fermer le répertoire", argv[2]);
    return EXIT_SUCCESS;
}


1 2

Cette discussion est classée dans : fichier, récupérer, mot, résultat, commande


Répondre à ce message

Sujets en rapport avec ce message

Mot au hasard d'un fichier text [ par sreef ] SreefSalut les programmeurs je cherchent une fonction en C++ qui me permettrait de renvoyer un mot pris au hasard dans un fichier text comportant une ça concerne la lecture et l'ecriture sur un fichier et ... [ par wfish ] voila mon pb :j'ai fais un ptit prog de traitement de fichier. il sert à mettre certaines infos prises dans un fichier et les mettre dans un autre !!1 Rechercher une chaîne de caractère dans un fichier et afficher la ligne !! [ par UncleShu ] Exemple : Mot à rechercher :-> friend----fichier où il faut rechercher le mot-----enfant childenfants childrenami friendwhen Probleme de gestion de fichier et gestion de l ehrue en C [ par croft ] Mr.croftG un probleme avec un fichier texte contenant un mot sur chaque ligne .Il me faudrait un code qui pourrrait me ressortir aleatoirment un mot d recherche d'info dans une ligne d'un fichier [ par GazGaz ] lu all je voudrait savoir si je pouvai faire un recherche dans un fichier, d'un mot ou groupe de mots spécifiques ? genre j'ai une ligne et dans celle MFC Récupérer le nom fichier via la boite de dialogue par defaut [ par TRASH52 ] TRASH52http://www.shootopc.comSalut à tous!J'explique mon probleme! (Assez mot de passe [ par jeromedu94 ] bonjour,J'aimerais savoir comment est ce qu'on fait pour mettre un mot de passe à un fichier.J'ai regardé quelques exemple de sources, mais j'ai pas r Integration fonction C [ par metek ] Bonjour!!Voila j'ai une ptite question sur les API!!!J'ai fait un petit programme qui liste un fichier texte cherche un mot entré et recupere le reste Récupérer le nom d'un fichier [ par Inekman ] Bonjour à tous,Je souhaite récupérer uniquement le nom du fichier choisis dans une boîte de dialogue ouverte par "GetOpenFileName".Votre aide m'est pr Récupérer une chaine dans un fichier texte [ par alncool ] En fait je dispose d'une classe avec trois attributs de type string. J'ai réalisé une surcharge de l'opérateur << pour pouvoir écrire dans un fichier


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,576 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales