[C++]System()

Iniciado por Poyoncio, 28 Agosto 2016, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Poyoncio

Tengo un problema que me esta costando bastante de solucionar.

Tengo un array, con una ruta de un directorio concreto (anteriormente parseado), y lo que pasa es que intento pasar ese parametro a system() con varios comandos y no puedo esto es lo que tengo hasta ahora y he intentado varias veces:
Código (cpp) [Seleccionar]

char ruta_final[20]="C:\\Users\\user"; //Realmente la operacion para obtener la ruta es mas complicada

system("cd ",ruta_final," && dir"); //Tambien lo he intentado con + en vez de comas



Se que la variable que se le tiene que pasar por parametro a system tiene que ser de tipo char*, pero no consigo saber como pasar por parametro esos valores.

Tambien e intentado con strings y no funciona. Hay alguna funcion predeterminada para pasar un valor de tipo char a un valor de tipo char*?

Tambien e intentado lo siguiente:
Código (cpp) [Seleccionar]

#include <strings>
char ruta_final[20]="C:\\Users\\user"
string comando="cd ",ruta_final," && dir";
system(c_str(comando));

Pero tampoco funciona...


Ya que he abierto post, me gustaria saber si hay alguna otra forma de ejecutar comandos de tipo cmd, pero sin usar system para c++??? nose alomejor llamando a alguna dll o algo por el estilo.

Muchas gracias! :P :rolleyes:
Curso de ensamblador desde cero

ivancea96

comando.c_str(). Es un método de clase.

Poyoncio

Cita de: ivancea96 en 28 Agosto 2016, 21:39 PM
comando.c_str(). Es un método de clase.
Ui lo havia hecho asi, nose porque lo puse mal.

Pero sige dando error porque no se puede declarar la string correctamente.

Código (cpp) [Seleccionar]

string comando="cd "+ruta_final+" && dir"; //Genera error igualmente


Alguna idea??
Curso de ensamblador desde cero

ivancea96

ruta_final es char[+. ¿Por qué no trabajas solo con string?

El problema es que estás haciendo char* + char[20] + char*.
Si trabajas con string, será char* + string + char*, y eso será correcto.
En C++, es preferible que trabajes siempre string (salvo casos particulares).

Poyoncio

Cita de: ivancea96 en 28 Agosto 2016, 22:30 PM
ruta_final es char[+. ¿Por qué no trabajas solo con string?

El problema es que estás haciendo char* + char[20] + char*.
Si trabajas con string, será char* + string + char*, y eso será correcto.
En C++, es preferible que trabajes siempre string (salvo casos particulares).
Vale, gracias, lo acabo de solucionar, suelo trabajar con strings, pero al ser una operacion de comparacion de letras preferia usar char.

Ademas pensaba que char*+char+char* era mas copatible que char*+string+char*

Dejo aqui la solucion por si alguien tiene el mismo problema :)

Código (cpp) [Seleccionar]

#include <string>
ruta_final[20]="C:\\Users\\user"; //Antes de esto havian varios bucles y operaciones por eso uso char y no strings
string comando_ruta=ruta_final;
string comando="cd "+comando_ruta+" && dir";

system(comando.c_str());



Y referente a la otra duda de usar una alternativa a system() conoces alguna otra opcion??


Gracias de nuevo :rolleyes: ;-)
Curso de ensamblador desde cero

ivancea96

Iba a postearlo antes, pero me dio un error el foro.

ShellExecute, de windows.h

Por ejemplo, para crear un directorio con mkdir:

Código (cpp) [Seleccionar]
ShellExecute(NULL, NULL, "cm_d.exe", "/c mkdir \"C:\\directorio\"", NULL, 0);

El tercer argumento es el ejecutable que ejecutar (cmd en este caso). Luego, vienen los parámetros. Si a cmd se le pasa un /c, se le puede poner luego un comando.
El resto de parámetros, míralos en la url si quieres si quieres. Tiene varias opciones.

De todos modos, salvo que <realmente lo necesites>, te diría que utilices system. En primer lugar, porque evitas meterte en funciones que aumentarán la complejidad del código. Y luego, porque así evitas usar las librerías de windows.


NOTA IMPORTANTE: Puse cm_d.exe porque sinó el foro lo detecta como si fuera un ataque, supongo. Quita la barrabaja, '_'

Poyoncio

Cita de: ivancea96 en 28 Agosto 2016, 23:49 PM
Iba a postearlo antes, pero me dio un error el foro.

ShellExecute, de windows.h

Por ejemplo, para crear un directorio con mkdir:

Código (cpp) [Seleccionar]
ShellExecute(NULL, NULL, "cm_d.exe", "/c mkdir \"C:\\directorio\"", NULL, 0);

El tercer argumento es el ejecutable que ejecutar (cmd en este caso). Luego, vienen los parámetros. Si a cmd se le pasa un /c, se le puede poner luego un comando.
El resto de parámetros, míralos en la url si quieres si quieres. Tiene varias opciones.

De todos modos, salvo que <realmente lo necesites>, te diría que utilices system. En primer lugar, porque evitas meterte en funciones que aumentarán la complejidad del código. Y luego, porque así evitas usar las librerías de windows.


NOTA IMPORTANTE: Puse cm_d.exe porque sinó el foro lo detecta como si fuera un ataque, supongo. Quita la barrabaja, '_'
Esa funcion estaba mirando precisamente, pero me parece que no me servira, porque segun tengo entendido se ejecuta paralelamente a mi codigo es decir mientras se ejecuta, se sige ejecutando mi codigo, pero yo necesito utilizar el retorno antes que nada, es decir que seguramente me genere errores a la larga.

Pero igualmente muchisimas gracias  :P :silbar: ;-)
Curso de ensamblador desde cero

ivancea96

Por hacer, recuerda que no necesitas comandos de consola para hacer nada. TU programa, la api de windows y las librerías de C++ son más que suficientes para valerse por sí mismos.
Engeneral, la api de windows te dará todo lo que necesitas. Hay funciones para todo:
Cambiar el directorio: SetCurrentDirectory
Listar un directorio: FindFirstFile y FindNextFile
Crear carpetas: CreateDirectory

Etc etc

Poyoncio

Cita de: ivancea96 en 29 Agosto 2016, 00:05 AM
Por hacer, recuerda que no necesitas comandos de consola para hacer nada. TU programa, la api de windows y las librerías de C++ son más que suficientes para valerse por sí mismos.
Engeneral, la api de windows te dará todo lo que necesitas. Hay funciones para todo:
Cambiar el directorio: SetCurrentDirectory
Listar un directorio: FindFirstFile y FindNextFile
Crear carpetas: CreateDirectory

Etc etc
Lo se, pero en esa funcion lo que queria hacer exactamente era, hacer un dir en cmd, moverme al directorio principal y ejecutar un solo comando mas para listar todos los archivos del sistema.

Con la api de windows seria mucho mas tedioso no? Ademas que ahora mismo lo que me interesa es que pese poquisimo. Y creo que llevarme toda la api para utilizar un par de comandos...
Curso de ensamblador desde cero

ivancea96

Por el peso no te preocupes. No va a meter en tu programa toda la api de windows. Solo lo que uses.
Y hablamos de KB por lo general.

Sería más tedioso, pero tendrías más control y harías exactamente lo que tu quisieras.
Pero bueno, si es algo muy simple, no vale la pena. System llega.