2012-05-19 33 views
6

popen() của C++ trả về một bộ mô tả tập tin chứa đầu ra, sau khi thực hiện một quy trình. Thay vì một FILE *, tôi cần một char *, tức là. một chuỗi là đầu ra của tôi. Tôi làm gì? Làm ơn giúp tôi.Đầu ra của C++ popen() vào một chuỗi

+3

Có một cái nhìn vào chủ đề này: http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c Chúc may mắn! – DCMaxxx

Trả lời

5

Tôi cho rằng tôi muốn làm điều gì đó về tự chung này:

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

Nếu bạn muốn nhận được phức tạp hơn, bạn có thể phân bổ không gian năng động, và cố gắng để tăng nó nếu cần thiết để giữ lượng đầu ra bạn lấy. Đó sẽ là một lộ trình tốt hơn trừ khi bạn có ít nhất một số ý tưởng về sản lượng của đứa trẻ.

Chỉnh sửa: Cho rằng bạn đang sử dụng C++, một kết quả với kích thước động thực sự là khá dễ dàng:

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

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

Tại sao không sử dụng 'std :: string' cho kết quả cuối cùng và sử dụng' append'? –

+0

@KerrekSB: Chủ yếu là vì tôi bằng cách nào đó nghĩ rằng nó đã được gắn thẻ là C chứ không phải là C++. –

2

Đọc đầu ra từ FILE* thành chuỗi bằng cách sử dụng các thường lệ stdio thường trình.

+3

Cảm ơn bạn đã trả lời. Bạn có thể vui lòng cung cấp mã mẫu ... !!! ??? –

1

Xem https://stackoverflow.com/a/10702464/981959

Bạn có thể làm điều đó trong hai dòng (ba bao gồm một typedef để cải thiện khả năng đọc):

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

Điều này sẽ đảm bảo việc phân bổ bộ nhớ và đóng lại luồng khi bạn kết thúc.

Các vấn đề liên quan