2012-05-19 29 views
6

C++ popen() devuelve un descriptor de archivo que contiene la salida, después de ejecutar un proceso. En lugar de un ARCHIVO *, necesito un char *, es decir. una cuerda para ser mi salida. ¿Qué debo hacer? Por favor, ayúdame.C++ popen() 'salida a una cadena

+3

Tenga una mirada a este tema: http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c ¡Buena suerte! – DCMaxxx

Respuesta

5

supongo que me gustaría hacer algo en este orden general:

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

Si desea obtener más elaborada, que se pudo asignar espacio de forma dinámica, y tratar de aumentarlo si es necesario para mantener la cantidad de producción usted obtiene. Esa sería una mejor ruta a menos que tenga al menos alguna idea de la cantidad de producción que el niño podría producir.

Editar: Teniendo en cuenta que usted está usando C++, un resultado con el tamaño dinámico es realmente muy fácil:

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

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

¿Por qué no utilizar 'std :: string' para el resultado final y usar' append'? –

+0

@KerrekSB: Principalmente porque de alguna manera pensé que estaba etiquetado como C en lugar de C++. –

2

Lea la salida del FILE* en una cadena utilizando las rutinas habituales stdio.

+3

Gracias por responder. ¿Podría por favor proporcionar un código de muestra ... !!! ??? –

1

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

Puede hacerlo en dos líneas (tres incluyendo un typedef a mejorar la legibilidad):

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

Esto se encarga de todas las asignaciones de memoria y de cerrar la secuencia de nuevo cuando haya terminado con la misma.