Вывод 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;
см.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());
}
Это позаботится обо всем распределении памяти и снова закроет поток, когда вы закончите с ним.