2012-07-03 36 views
6

Tengo un programa en C++ que ejecuto para muchos valores de un parámetro. Lo que quiero hacer es la siguiente: Digamos que tengo dos parámetros como:Entrada desde la línea de comando

int main(){ 
    double a; 
    double b; 
//some more lines of codes 
} 

Ahora, después de después de compilar quiero ejecutarlo como

./output.out 2.2 5.4 

Para que a toma el valor 2,2 y b toma el valor 5.4.

Por supuesto, una forma es usar cin>> pero no puedo hacer eso porque ejecuto el programa en un clúster.

+0

¿Por qué no utilizar argumentos de línea de comandos (es decir, argv)? Por supuesto, debes convertirlos luego al tipo "doble". – Mahesh

Respuesta

20

Es necesario utilizar command line arguments en su main:

int main(int argc, char* argv[]) { 
    if (argc != 3) return -1; 
    double a = atof(argv[1]); 
    double b = atof(argv[2]); 
    ... 
    return 0; 
} 

Este código analiza parámetros utilizando atof; podría usar stringstream en su lugar.

+0

No use 'const char * argv []', simplemente use 'char * argv []', -1 hasta que se solucione. –

+0

@ RichardJ.RossIII Esto ahora está arreglado. – dasblinkenlight

+0

Ahora obtiene un +1 :) –

11

Si desea utilizar parámetros de línea de comandos, entonces no, no utilice use cin ya que es demasiado tarde. Es necesario cambiar su firma main a:

int main(int argc, char *argv[]) { 
    // argc is the argument count 
    // argv contains the arguments "2.2" and "5.4" 
} 

por lo que ahora tienen argv que es una matriz de puntero a char, cada puntero que apunta a un argumento que fue aprobada. El primer argumento suele ser la ruta a su ejecutable, los argumentos posteriores son los que se pasaron cuando se inició su aplicación, en forma de punteros al char.

Necesitará convertir el char* 's a double s en este caso.

+2

Estoy bastante seguro de que es 'int argc', no' size_t'. Corrígeme si estoy equivocado. – Linuxios

+0

@Linuxios: Sí, tienes razón.Algunos compiladores permiten 'size_t', pero el estándar solo exige que' int main() 'y' int main (int, char * []) ​​'sean aceptados, cualquier otra cosa es implementación definida (bueno, el estándar C++ 98 que He estado mintiendo de todos modos ...) –

0

Se puede usar esta forma de la función main() a obtener argumentos de línea de comandos

int main(int argc, char* argv[]) { 

    } 

donde los valores de la matriz argv[] contienen las variables de línea de comandos como char* que se necesita para convertir a floats o doubles en su caso

3

Eso es lo que los argumentos de línea de comandos son para:

#include <sstream> 

int main(int argc, char *argv[]) 
{ 
    if (argv < 3) 
     // show error 
    double a, b; 

    std::string input = argv[1]; 
    std::stringstream ss = std::stringstream(input); 

    ss >> a; 

    input = argv[2]; 
    ss = std::stringstream(input); 

    ss >> b; 

    // a and b are now both successfully parsed in the application 
} 
3

¿Has mirado boost program options?

Tomará los argumentos de línea de comandos como muchos otros sugieren y le permite proporcionar una interfaz de línea de comando muy consistente, limpia y extensible.

+1

Si ya está usando boost entonces sí, es agradable, pero no incluiría boost en una aplicación solo para analizar algunos argumentos simples de línea de comando. –

+1

Siempre he encontrado que el análisis de argumentos comienza de manera simple, y rápidamente se sale de control al introducir errores sutiles y restricciones a medida que la herramienta crece. – Zac

+0

Supongo que depende de cuán complejos pueden ser tus argumentos. Para args simples tipo [valor de interruptor] nunca he tenido un problema. –

Cuestiones relacionadas