c ++: вывод подпроцесса в stdin - PullRequest
       24

c ++: вывод подпроцесса в stdin

10 голосов
/ 09 декабря 2011

Предположим, я хочу вызвать подпроцесс из моей программы, и я хочу прочитать вывод этого подпроцесса в мою программу.

Вот тривиальный способ сделать это:

//somefile.cpp
system("sub_process arg1 arg2 -o file.out");
           //call the subprocess and have it write to file
FILE *f = std::fopen("file.out", "r");
//.... and so on

Мы все знаем, что операции ввода-вывода вычислительно медленны.Чтобы ускорить это, я хотел бы пропустить шаг «запись в файл, затем чтение из файла» и вместо этого перенаправить вывод этого подпроцесса непосредственно в stdin (или какой-нибудь другой поток)

Как бы я это сделал?Как пропустить операцию ввода-вывода?

Примечание: многие программы выкладывают некоторые диагностические данные в stdout во время их работы и записывают чистую версию вывода в stdout (например: stdout: "step1 ...done, step2 ... done, step3..done "-o file-out:" Магическое число: 47.28 "), поэтому игнорируем аргумент" -o "и надеемся, что выходные данные будут автоматически перенаправлены на стандартный выводне обязательно полезно ...

Спасибо всем заранее.

Ответы [ 3 ]

7 голосов
/ 09 декабря 2011

Использование popen пропускает файл и получает вывод вашей команды через буфер в памяти.

#include <iomanip>
#include <iostream>
using namespace std;
const int MAX_BUFFER = 255;
int main() {
    string stdout;
    char buffer[MAX_BUFFER];
    FILE *stream = popen("command", "r");
    while ( fgets(buffer, MAX_BUFFER, stream) != NULL )
    stdout.append(buffer);
    pclose(stream);
    cout << endl << "output: " << endl << stdout << endl;
}
3 голосов
/ 09 декабря 2011

Если вы оказались на окнах:

следуйте этому: http://support.microsoft.com/kb/190351

Это описывает это лучше, чем я когда-либо.Вы можете перенаправить все, куда угодно.

2 голосов
/ 09 декабря 2011

Лучше всего открыть команду оболочки с помощью popen().Это позволяет вам передать команду и получить обратно FILE* указатель на вывод.Смотри http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/popen.html

...