90 votes

Comment exécuter un programme externe à partir de C et analyser sa sortie ?

J'ai un utilitaire qui sort une liste de fichiers requis par un jeu. Comment puis-je exécuter cet utilitaire dans un programme C et saisir sa sortie afin que je puisse agir sur lui dans le même programme ?

MISE À JOUR : Bon appel sur le manque d'information. L'utilitaire recrache une série de chaînes, et c'est censé être portable sur Mac/Windows/Linux. Veuillez noter que je cherche un moyen programmatique d'exécuter l'utilitaire et de conserver sa sortie (qui va à stdout).

88voto

MestreLion Points 1789

Comme d'autres l'ont souligné, popen() est la méthode la plus standard. Et comme aucune réponse n'a fourni d'exemple utilisant cette méthode, voici :

#include <stdio.h>

#define BUFSIZE 128

int parse_output(void) {
    char *cmd = "ls -l";    
    
    char buf[BUFSIZE];
    FILE *fp;

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("OUTPUT: %s", buf);
    }

    if (pclose(fp)) {
        printf("Command not found or exited with error status\n");
        return -1;
    }

    return 0;
}

Échantillon de sortie :

OUTPUT: total 16
OUTPUT: -rwxr-xr-x 1 14077 14077 8832 Oct 19 04:32 a.out
OUTPUT: -rw-r--r-- 1 14077 14077 1549 Oct 19 04:32 main.c

11voto

Adam Pierce Points 12801

popen est pris en charge sur Windows, voir ici :

http://msdn.microsoft.com/fr-fr/library/96ayss4b.aspx

Si vous voulez que ce soit multi-plateforme, Popen est la voie à suivre.

3voto

Jeff Hengesbach Points 1762

Dans Linux et OS X, popen() est vraiment votre meilleur pari, comme l'a souligné dmckee, puisque les deux OS prennent en charge cet appel. Dans Windows, cela devrait aider : http://msdn.microsoft.com/fr-fr/library/ms682499.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X