Come leggere / reindirizzare l'output di un comando dos su una variabile di programma in C / C ++?
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?
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";
}