Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 4dr14n31t0r en 17 Noviembre 2016, 23:50 pm



Título: Escribir en la entrada de datos de un programa desde c
Publicado por: 4dr14n31t0r en 17 Noviembre 2016, 23:50 pm
Imaginense que por ejemplo tengo en C una variable de tipo string que contiene la sentencia que hay que ejecutar para hacer una consulta en mysql, y quiero enviar ese string al standard input del mysql para ejecutar el script. O imaginense que tengo un string bastante largo con muchas lineas y quiero usar el programa grep para encontrar un trozo de texto del mismo. Solo pongo estos como ejemplos para que entiendan lo que realmente quiero. ¿Podrian decirme como se puede hacer? ¿Que metodos hay que usar y como y de que librerias, etc?


Título: Re: Escribir en la entrada de datos de un programa desde c
Publicado por: engel lex en 18 Noviembre 2016, 01:22 am
puedes usar system para llamar a la consola

http://www.cplusplus.com/reference/cstdlib/system/ (http://www.cplusplus.com/reference/cstdlib/system/)

los comandos que pongas allí pueden no ser portables entre diferentes OS ... así que cuando compiles de win para lin o osx cuidado


Título: Re: Escribir en la entrada de datos de un programa desde c
Publicado por: 4dr14n31t0r en 19 Noviembre 2016, 22:59 pm
Eso ya lo sabia, pero no me referia a eso.
En Java, cuando ejecutas un comando usando Runtime.getRuntime.exec, puedes obtener el bufferedInput/Output Stream para pillar la salida del comando y para enviar datos a la entrada del mismo. Mi pregunta es ¿Hay alguna forma de hacer lo mismo en C?


Título: Re: Escribir en la entrada de datos de un programa desde c
Publicado por: Drewermerc en 20 Noviembre 2016, 01:39 am
Hola 4dr14n31t0r.
puedes usar system como ya te lo menciono engel lex, con el manejo de ficheros y un poco de batch, creo que puedes lograr lo que quieres.
Hice un pequeño ejemplo rapido sobre lo que planteaste en los ejemplos, espero que te sirva.

Si quieres tener mañor control puedes usar pipe() y fork() de posix que te da mayor control en el flujo de las entrada y salidas, la libreria que se usa es unistd.h.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. FILE *abrir(char *nombre);
  5.  
  6. int main(void){
  7.    char *c1 = "Este es  un texto de prueba para poder";
  8.    char *c2 = "probar el manejo de entrada y salida de grep";
  9.    char *query = "select * from prueba;";
  10.    FILE *file, *tmpFile;
  11.  
  12.    file = abrir("prueba.txt");
  13.    tmpFile = abrir("tmp.txt");
  14.  
  15.    fprintf(tmpFile, "%s\n", "use test");
  16.    fprintf(tmpFile, "%s", query);
  17.  
  18.    fclose(file);
  19.    fclose(tmpFile);
  20.    system("mysql < tmp.txt");
  21.    system("rm tmp.txt");
  22.  
  23.    tmpFile = abrir("tmp.txt");
  24.    file = abrir("prueba.txt");
  25.  
  26.    fprintf(file, "%s\n", c1);
  27.    fprintf(file, "%s", c2);
  28.  
  29.    fclose(file);
  30.    fclose(tmpFile);
  31.  
  32.    system("cat prueba.txt | grep texto >> tmp.txt");
  33.    system("cat tmp.txt");
  34.  
  35.    system("rm tmp.txt");
  36.  
  37.    getchar();
  38.  
  39.    return EXIT_SUCCESS;
  40. }
  41.  
  42. FILE *abrir(char *nombre){
  43.    FILE *file;
  44.    if(!(file = fopen(nombre, "wa"))){
  45.        perror("Archivo no creado");
  46.        exit(-1);
  47.    }
  48.  
  49.  

Saludos,
Drewermerc.