Comment lire / rediriger la sortie d'une commande dos vers une variable de programme en C / C ++?

StackOverflow https://stackoverflow.com/questions/1404189

  •  05-07-2019
  •  | 
  •  

Question

Je souhaite exécuter une commande dos à partir de mon programme, par exemple, "dir" " commander. Je le fais comme,

system("dir");

Existe-t-il un moyen de lire le résultat de cette commande directement dans une variable de programme?

Nous pouvons toujours rediriger la sortie vers un fichier, puis lire ce fichier en faisant

system ("dir" & command.out ");

Et ensuite, lecture du fichier command.out. Mais comment pouvons-nous le faire directement plutôt que de rediriger vers un fichier puis de le lire?

Était-ce utile?

La solution 3

Vous avez trouvé un moyen alternatif ou plutôt l’équivalent Windows de Popen. C'est _popen (). Cela fonctionne pour moi et en plus, il est facile à utiliser.

   char   psBuffer[128];
   FILE   *pPipe;

   if( (pPipe = _popen( "dir", "rt" )) != NULL)
  {
     while(fgets(psBuffer, 128, pPipe))
     {
       printf(psBuffer);
     }
  }

Trouvez les détails avec l'exemple complet ici .

Autres conseils

Vous ne pouvez pas le rediriger vers une variable, mais vous pouvez faire une astuce similaire à la façon dont les pipes sont utilisées dans Unix pour chaîner des commandes. Appelez CreateProcess () et transmettez-lui une instance STARTUPINFO avec les poignées définies et STARTF_USESTDHANDLES dans STARTUPINFO :: dwFlags . Ensuite, lisez les données provenant du processus généré à l'aide des poignées d'ensemble.

Si votre bibliothèque possède la fonction POSIX popen () , c'est ce dont vous avez besoin. Vous pouvez lire le résultat de la commande dans pipe et l’analyser à votre guise.

FILE *dir;
char direntry[80];

dir = popen("dir", "r");
while (!feof(dir)) {
    fgets(direntry, sizeof(direntry), dir);
    /* do something with direntry */
}

Vous ne pouvez pas. Les programmes s'exécutent dans des espaces mémoire différents, car ce sont des processus différents. En règle générale, dans les systèmes d'exploitation modernes, les processus ne partagent pas de mémoire.

En outre, il serait difficile de définir une variable en C pouvant contenir la sortie d'une commande telle que "dir" ;; il faudrait qu'il grandisse dynamiquement pour faire de la place.

La meilleure solution consiste à utiliser un tuyau , cela permettra de lire la sortie de la commande à partir d’un flux, à partir duquel vous pourrez la stocker à votre guise.

Utilisez popen (), il fait exactement ce que vous voulez.
Il crée un canal bidirectionnel, lance les processus. Dans l’enfant, il connecte ensuite le canal à l’entrée et à la sortie standard puis exécute la commande spécifiée comme premier paramètre à popen ().

#include <stdio.h>
#include <string>
#include <iostream>

int main()
{
    std::string     output;
    FILE*           data    = popen("cat PLOP","r");

    for(char c = getc(data);c != EOF;c = getc(data))
    {
        output  += c;
    }
    pclose(data);

    std::cout << "Data(" << output << ")\n";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top