Как прочитать / перенаправить вывод команды dos в программную переменную на C / C ++?
Вопрос
Я хочу запустить команду 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 */
}
Ты не можешь. Программы работают в разных пространствах памяти, так как это разные процессы. Как правило, в современных операционных системах процессы не разделяют память.
Кроме того, было бы трудно определить переменную в C, которая может содержать выходные данные команды, например " dir " ;; это должно было бы динамически расти, чтобы освободить место.
Лучший способ - использовать канал , что позволит читать выходные данные команды из потока, из которого вы можете сохранить ее по своему усмотрению.
Используйте 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";
}