¿Cómo leer / redirigir la salida de un comando dos a una variable de programa en C / C ++?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Quiero ejecutar un comando dos desde mi programa, por ejemplo " dir " mando. Lo estoy haciendo como,

system("dir");

¿Hay alguna forma de leer la salida de ese comando directamente en una variable de programa?

Siempre podemos redirigir la salida a un archivo y luego leer ese archivo, haciendo
sistema (" dir > command.out ");

Y luego leer el archivo command.out. Pero, ¿cómo podemos hacerlo directamente en lugar de redirigir a un archivo y luego leer?

¿Fue útil?

Solución 3

Encontrado una forma alternativa o más bien equivalente de Windows de popen. Es _popen (). Esto funciona bien para mí y, además, es fácil de usar.

   char   psBuffer[128];
   FILE   *pPipe;

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

Encuentre los detalles con el ejemplo completo aquí .

Otros consejos

No puedes redirigirlo a una variable, pero puedes hacer un truco similar a cómo se usan las tuberías en Unix para los comandos de encadenamiento. Llame a CreateProcess () , y páselo como una instancia de STARTUPINFO con los identificadores establecidos y STARTF_USESTDHANDLES en STARTUPINFO :: dwFlags . Luego, lea los datos que provienen del proceso generado a través de los controladores establecidos.

Si su biblioteca tiene la función POSIX popen () , eso es lo que necesita. Puede leer la salida de comandos de la tubería y analizarla de la forma que desee.

FILE *dir;
char direntry[80];

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

No puedes. Los programas se ejecutan en diferentes espacios de memoria, ya que son procesos diferentes. Generalmente, en los sistemas operativos modernos, los procesos no comparten memoria.

Además, sería difícil definir una variable en C que pueda contener la salida de un comando como " dir " ;; necesitaría crecer dinámicamente para hacer espacio.

La mejor manera es usar una canalización , que hará posible leer el resultado del comando desde una secuencia, desde donde puede almacenarlo como mejor le parezca.

Usa popen () hace exactamente lo que quieres.
Crea una tubería bidireccional, bifurca los procesos. En el niño, luego conecta la tubería a la entrada estándar y la salida estándar, luego ejecuta el comando especificado como el primer parámetro para abrir ().

#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";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top