2012-05-19 3 views
6

C++ popen() возвращает дескриптор файла, содержащий результат после выполнения процесса. Вместо FILE * мне нужен символ char *, т.е. строка будет моим выходом. Что я делаю? Пожалуйста, помогите мне.Вывод C++ popen() в строку

+3

Посмотрите на эту тему: http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c Удачи! – DCMaxxx

ответ

5

Я предполагаю, что я хотел бы сделать что-то на этом общем порядке:

char big_buffer[BIG_SIZE]; 
char small_buffer[LINE_SIZE]; 
unsigned used = 0; 

big_buffer[0] = '\0'; // initialize the big buffer to an empty string 

// read a line data from the child program 
while (fgets(small_buffer, LINE_SIZE, your_pipe)) { 
    // check that it'll fit: 
    size_t len = strlen(small_buffer); 
    if (used + len >= BIG_SIZE) 
     break; 

    // and add it to the big buffer if it fits 
    strcat(big_buffer, small_buffer); 
    used += strlen(small_buffer); 
} 

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

Edit: Учитывая, что вы используете C++, результат с динамическим размером на самом деле довольно легко:

char line[line_size]; 
std::string result; 

while (fgets(line, line_size, your_pipe)) 
    result += line; 
+0

Почему бы не использовать 'std :: string' для окончательного результата и использовать' append'? –

+0

@KerrekSB: В основном потому, что я как-то думал, что он был помечен как C, а не C++. –

2

Прочитайте вывод из FILE* в строку, используя обычные процедуры stdio.

+3

Спасибо, что ответили. Не могли бы вы предоставить пример кода ... !!! ??? –

1

См https://stackoverflow.com/a/10702464/981959

Вы можете сделать это в две строки (три включая ЬурейеЕ к улучшить читаемость):

#include <pstream.h> 
#include <string> 
#include <iterator> 

int main() 
{ 
    redi::ipstream proc("./some_command"); 
    typedef std::istreambuf_iterator<char> iter; 
    std::string output(iter(proc.rdbuf()), iter()); 
} 

Это относится ко всему распределению памяти и закрытию потока снова, когда вы закончите с ним.

Смежные вопросы