Как прочитать / перенаправить вывод команды dos в программную переменную на C / C ++?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Я хочу запустить команду dos из моей программы, например " dir " команда. Я делаю это как

system("dir");

Есть ли способ прочитать вывод этой команды непосредственно в программную переменную?

Мы всегда можем перенаправить вывод в файл, а затем прочитать этот файл, выполнив
system (" dir > command.out ");

А затем читаем файл command.out. Но как мы можем сделать это напрямую, а не перенаправлять в файл и затем читать?

Это было полезно?

Решение 3

Найден альтернативный способ или, вернее, Windows, эквивалентный popen. Это _popen (). Это работает как раз для меня, и, кроме того, он прост в использовании.

   char   psBuffer[128];
   FILE   *pPipe;

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

Подробности см. в полном примере здесь .

Другие советы

Вы не можете перенаправить его в переменную, но вы можете сделать трюк, подобный тому, как каналы используются в Unix для объединения команд. Позвоните в CreateProcess () и передайте ему экземпляр STARTUPINFO с соответственно установленными дескрипторами и STARTF_USESTDHANDLES в STARTUPINFO :: dwFlags . Затем прочитайте данные, поступающие из порожденного процесса, через заданные дескрипторы.

Если в вашей библиотеке есть функция POSIX popen () , это то, что вам нужно. Вы можете прочитать вывод команды из канала и проанализировать его так, как вам нравится.

FILE *dir;
char direntry[80];

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

Используйте popen (), он делает именно то, что вы хотите.
Создает двунаправленную трубу, разветвляет процессы. Затем дочерний процесс соединяет канал со стандартным входом и стандартным выходом, а затем выполняет команду, указанную в качестве первого параметра для 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";
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top