Accueil > Forum > > > > récupérer en C++ le résultat d'une commande
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
|
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
|
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
|
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
|
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
|
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; }
|
|
Cette discussion est classée dans : fichier, récupérer, mot, résultat, commande
Répondre à ce message
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|