Вывод c++ popen () в строку

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

3 ответов


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

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

big_buffer[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;

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


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

вы можете сделать это в двух строках (три, включая typedef для улучшения читаемости):

#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());
}

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