Como ler / redirecionar a saída de um dos comandar a uma variável de programa em C / C ++?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu quero correr um comando dos do meu programa, por exemplo comando "dir". Eu estou fazendo isso como,

system("dir");

Existe alguma maneira de ler a saída do comando diretamente em uma variável de programa?

Nós sempre pode redirecionar a saída para um arquivo e, em seguida, ler esse arquivo, fazendo
system("dir > command.out");

E, em seguida, ler o arquivo command.out. Mas como podemos fazê-lo diretamente, em vez de redirectling para um arquivo e, em seguida, lendo?

Foi útil?

Solução 3

Encontrado uma maneira alternativa ou em vez de janelas equivalente popen. É _popen (). Isso funciona apenas para a direita para mim e, além disso, é fácil de usar.

   char   psBuffer[128];
   FILE   *pPipe;

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

Encontre os detalhes com plena exemplo aqui .

Outras dicas

Você não pode redirecioná-lo a uma variável, mas você pode fazer um truque semelhante à forma como tubos são usados ??em Unix para encadear comandos. Chamada CreateProcess() , e passá-lo uma instância STARTUPINFO com alças em conformidade definidos e STARTF_USESTDHANDLES em STARTUPINFO::dwFlags. Então leia os dados provenientes do processo gerado através das alças de ajuste.

Se a sua biblioteca tem popen() função POSIX, que é o que você precisa. Você pode ler a saída do comando da tubulação e analisá-lo como quiser.

FILE *dir;
char direntry[80];

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

Você não pode. Os programas são executados em espaços de memória diferentes, pois são processos diferentes. Geralmente, nos sistemas operacionais modernos, os processos não compartilham memória.

Além disso, seria difícil definir uma variável em C que pode conter a saída de um comando como "dir"; é precisaria crescer dinamicamente para fazer o quarto.

A melhor maneira é usar um tubo , que irá torná-lo possível ler a saída do comando de um córrego, a partir do qual você pode armazená-lo como quiser.

Use popen () ele faz exatamente o que você quer.
Ele cria um pipe bidirecional, garfos os processos. Na criança que então se conecta a tubulação de padrão dentro e fora padrão, em seguida, os executivos o comando especificado como o primeiro parâmetro 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";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top