c++: вывод подпроцесса в 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

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

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

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

спасибо всем продвижение.

3 ответов


используя 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;
}

Если вы случайно находитесь в windows:

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

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


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