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

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

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

//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

Мы все знаем, что операции ввода/вывода являются вычислительно медленными. Чтобы ускорить это, я хотел бы пропустить шаг write-to-file-then-read-from-file и вместо этого перенаправить вывод этого подпроцесса непосредственно в stdin (или некоторые другие поток)

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

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

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

Ответ 1

Использование 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;
}

Ответ 2

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

выполните следующие действия: http://support.microsoft.com/kb/190351

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