Как прочитать / перенаправить вывод команды dos в программную переменную на C / C ++? - PullRequest
4 голосов
/ 10 сентября 2009

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

system("dir");

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

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

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

Ответы [ 5 ]

4 голосов
/ 10 сентября 2009

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

   char   psBuffer[128];
   FILE   *pPipe;

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

Найти подробности с полным примером здесь .

4 голосов
/ 10 сентября 2009

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

FILE *dir;
char direntry[80];

dir = popen("dir", "r");
while (!feof(dir)) {
    fgets(direntry, sizeof(direntry), dir);
    /* do something with direntry */
}
4 голосов
/ 10 сентября 2009

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

1 голос
/ 10 сентября 2009

Вы не можете. Программы работают в разных пространствах памяти, так как это разные процессы. Как правило, в современных операционных системах процессы не разделяют память.

Кроме того, было бы трудно определить переменную в C, которая может содержать выходные данные команды, такие как «dir»; нужно было бы динамически расти, чтобы освободить место.

Лучший способ - использовать трубу , которая позволит читать выходные данные команды из потока, из которого вы можете сохранить ее, как считаете нужным.

0 голосов
/ 10 сентября 2009

Используйте 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...