7

C++'s popen() returns a file descriptor that contains the output, after executing a process. Instead of a FILE*, I need a char*, ie. a string to be my output. What do I do? Please help me.

4

3 に答える 3

6

私はこの一般的な順序で何かをすると思います:

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

さらに精巧にしたい場合は、スペースを動的に割り当て、必要に応じてスペースを増やして、取得する出力の量を保持することができます。子供がどれだけの出力を生成するかについて少なくともある程度の考えがない限り、それはより良いルートです。

編集: C++ を使用していることを考えると、動的サイズの結果は実際には非常に簡単です。

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

while (fgets(line, line_size, your_pipe))
     result += line;
于 2012-05-19T18:57:32.510 に答える
2

FILE*通常のstdioルーチンを使用して、からの出力を文字列に読み取ります。

于 2012-05-19T18:49:14.973 に答える
1

https://stackoverflow.com/a/10702464/981959を参照してください

2行で実行できます(読みやすさを向上させるためにtypedefを含む3行)。

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

これにより、すべてのメモリ割り当てが処理され、終了時にストリームが再び閉じられます。

于 2012-06-10T10:48:46.153 に答える