¿Cómo puedo ejecutar un progtwig externo desde C y analizar su salida?

Tengo una utilidad que muestra una lista de archivos requeridos por un juego. ¿Cómo puedo ejecutar esa utilidad dentro de un progtwig en C y obtener su resultado para poder actuar dentro del mismo progtwig?

ACTUALIZACIÓN: Buena llamada sobre la falta de información. La utilidad escupe una serie de cadenas, y se supone que es completamente portátil en Mac / Windows / Linux. Tenga en cuenta que estoy buscando una forma programática para ejecutar la utilidad y conservar su salida (que va a stdout).

Para problemas simples en entornos Unix-ish, pruebe popen() .

Desde la página man:

La función popen () abre un proceso creando un conducto, bifurcando e invocando el shell.

Si usa el modo de lectura, esto es exactamente lo que pidió. No sé si está implementado en Windows.

Para problemas más complicados, debe buscar la comunicación entre procesos.

Como han señalado otros, popen() es la forma más estándar. Y dado que ninguna respuesta proporcionó un ejemplo con este método, aquí va:

 #include  #define BUFSIZE 128 int parse_output(void) { char *cmd = "ls -l"; char buf[BUFSIZE]; FILE *fp; if ((fp = popen(cmd, "r")) == NULL) { printf("Error opening pipe!\n"); return -1; } while (fgets(buf, BUFSIZE, fp) != NULL) { // Do whatever you want here... printf("OUTPUT: %s", buf); } if(pclose(fp)) { printf("Command not found or exited with error status\n"); return -1; } return 0; } 

popen es compatible con Windows, mira aquí:

http://msdn.microsoft.com/en-us/library/96ayss4b.aspx

Si quieres que sea multiplataforma, popen es el camino a seguir.

Bueno, suponiendo que está en una línea de comando en un entorno de Windows, puede usar derivaciones o redirecciones de línea de comando. Por ejemplo,

 commandThatOutputs.exe > someFileToStoreResults.txt 

o

 commandThatOutputs.exe | yourProgramToProcessInput.exe 

Dentro de su progtwig, puede usar las funciones de entrada estándar C para leer la salida de otros progtwigs (scanf, etc.): http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output .asp . También puede usar el ejemplo de archivo y usar fscanf. Esto también debería funcionar en Unix / Linux.

Esta es una pregunta muy genérica, es posible que desee incluir más detalles, como qué tipo de salida es (solo texto o un archivo binario) y cómo desea procesarla.

Editar: aclaración Hooray!

Redirigir STDOUT parece ser problemático, tuve que hacerlo en .NET, y me dio todo tipo de dolores de cabeza. Parece que la forma correcta de C es engendrar un proceso secundario, obtener un puntero a un archivo y, de repente, me duele la cabeza.

Entonces aquí hay un truco que usa archivos temporales. Es simple, pero debería funcionar. Esto funcionará bien si la velocidad no es un problema (golpear el disco es lento), o si es desechable. Si está creando un progtwig empresarial, probablemente sea mejor investigar la redirección STDOUT, utilizando lo que otras personas recomendaron.

 #include  #include  int main(int argc, char* argv[]) { FILE * fptr; // file holder char c; // char buffer system("dir >> temp.txt"); // call dir and put it's contents in a temp using redirects. fptr = fopen("temp.txt", "r"); // open said file for reading. // oh, and check for fptr being NULL. while(1){ c = fgetc(fptr); if(c!= EOF) printf("%c", c); // do what you need to. else break; // exit when you hit the end of the file. } fclose(fptr); // don't call this is fptr is NULL. remove("temp.txt"); // clean up getchar(); // stop so I can see if it worked. } 

Asegúrate de verificar los permisos de tus archivos: en este momento, esto simplemente arrojará el archivo en el mismo directorio que un exe. Es posible que desee examinar el uso de /tmp en nix, o C:\Users\username\Local Settings\Temp en Vista, o C:\Documents and Settings\username\Local Settings\Temp in 2K/XP . Creo que /tmp funcionará en OSX, pero nunca he usado uno.

En Linux y OS X, popen() realmente es su mejor apuesta, como señaló dmckee, ya que ambos sistemas operativos respaldan esa llamada. En Windows, esto debería ayudar: http://msdn.microsoft.com/en-us/library/ms682499.aspx

La documentación de MSDN dice: Si se usa en un progtwig de Windows, la función _popen devuelve un puntero de archivo no válido que hace que el progtwig deje de responder indefinidamente. _popen funciona correctamente en una aplicación de consola. Para crear una aplicación de Windows que redirija las entradas y salidas, consulte Crear un proceso secundario con entrada y salida redirigidas en el SDK de Windows.

Puede usar system() como en:

 system("ls song > song.txt"); 

donde ls es el nombre del comando para listar el contenido de la canción de la carpeta y la song es una carpeta en el directorio actual. El archivo resultante song.txt se creará en el directorio actual.

 //execute external process and read exactly binary or text output //can read image from Zip file for example string run(const char* cmd){ FILE* pipe = popen(cmd, "r"); if (!pipe) return "ERROR"; char buffer[262144]; string data; string result; int dist=0; int size; //TIME_START while(!feof(pipe)) { size=(int)fread(buffer,1,262144, pipe); //cout<