Come leggere / reindirizzare l'output di un comando dos su una variabile di programma in C / C ++?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Voglio eseguire un comando dos dal mio programma, ad esempio " dir " comando. Lo sto facendo come,

system("dir");

Esiste un modo per leggere l'output di quel comando direttamente in una variabile di programma?

Possiamo sempre reindirizzare l'output su un file e quindi leggere quel file, facendo
system (" dir > command.out ");

E poi leggendo il file command.out. Ma come possiamo farlo direttamente anziché reindirizzare a un file e quindi leggere?

È stato utile?

Soluzione 3

Trovato un modo alternativo o piuttosto l'equivalente di windows di popen. È _popen (). Questo funziona perfettamente per me e inoltre è facile da usare.

   char   psBuffer[128];
   FILE   *pPipe;

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

Trova i dettagli con l'esempio completo qui .

Altri suggerimenti

Non puoi reindirizzarlo su una variabile, ma puoi fare un trucco simile a come le pipe vengono usate in Unix per i comandi di concatenamento. Chiama CreateProcess () e passare un'istanza STARTUPINFO con le maniglie impostate di conseguenza e STARTF_USESTDHANDLES in STARTUPINFO :: dwFlags . Quindi leggi i dati provenienti dal processo generato attraverso gli handle impostati.

Se la tua libreria ha la funzione POSIX popen () , questo è ciò di cui hai bisogno. Puoi leggere l'output del comando dalla pipe e analizzarlo come preferisci.

FILE *dir;
char direntry[80];

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

Non puoi. I programmi vengono eseguiti in spazi di memoria diversi, poiché sono processi diversi. Generalmente, nei moderni sistemi operativi, i processi non condividono la memoria.

Inoltre, sarebbe difficile definire una variabile in C che può contenere l'output di un comando come " dir " ;; avrebbe bisogno di crescere dinamicamente per fare spazio.

Il modo migliore è utilizzare a pipe , che consentirà di leggere l'output del comando da uno stream, dal quale è possibile memorizzarlo come meglio crede.

Usa popen () fa esattamente quello che vuoi.
Crea una pipe bidirezionale, forca i processi. Nel bambino quindi collega la pipe allo standard in e lo standard out quindi esegue il comando specificato come primo parametro a 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";
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top