2012-05-19 10 views
6

C++ popen() gibt einen Dateideskriptor zurück, der die Ausgabe enthält, nachdem ein Prozess ausgeführt wurde. Anstelle von FILE * brauche ich ein char *, dh. eine Zeichenfolge, um meine Ausgabe zu sein. Was mache ich? Bitte hilf mir.C++ popen() 's Ausgabe in eine Zeichenfolge

+3

Werfen Sie einen Blick auf diesen Thread: http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c Viel Glück! – DCMaxxx

Antwort

5

Ich nehme ich etwas auf dieser allgemeinen Ordnung tun würde:

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

Wenn Sie ausführlichere erhalten möchten, können Sie Raum dynamisch zuweisen könnte, und versuchen, es als notwendig zu erhöhen, um die Menge an Ausgangs zu halten du erhältst. Das wäre ein besserer Weg, wenn Sie nicht wenigstens eine Vorstellung davon haben, wie viel Output das Kind produzieren könnte.

Edit: Da Sie C verwenden ++, ein Ergebnis mit dynamischer Größe ist eigentlich recht einfach:

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

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

Warum verwenden Sie nicht eine 'std :: string' für das Endergebnis und verwenden' append'? –

+0

@KerrekSB: Hauptsächlich, weil ich irgendwie dachte, dass es als C und nicht C++ markiert wurde. –

2

Lesen Sie die Ausgabe von FILE* in eine Zeichenfolge mit den üblichen Routinen stdio.

+3

Danke für die Antwort. Könnten Sie bitte einen Beispielcode angeben ... !!! ??? –

1

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

Sie können es in zwei Linien tun (drei mit einem typedef Verbesserte Lesbarkeit):

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

Dies kümmert sich um die gesamte Speicherzuweisung und schließt den Stream wieder, wenn Sie damit fertig sind.