Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Mientras en 22 Agosto 2015, 05:20 am



Título: duda con cin.ignore()
Publicado por: Mientras en 22 Agosto 2015, 05:20 am
Hola a todos. Estoy aprendiendo c++(poo) y encontré un ejemplo que me generó una duda una duda. La linea que dice cin.ignore pensé que era innecesario ponerla ya que al iniciar el programa no se llenaría de "basura" pero luego pensé que si es necesario en caso llamemos varias veces al método. Entonces cuando ejecuto no me muestra directamente "Ingrese nombre de impuesto" si no que primero me espera a que presione enter. Como evito eso?

Este es el código.


Código
  1. #include <iostream>
  2. using namespace std;
  3. class impuesto
  4. {
  5. public:
  6.    // Funciones miembro
  7.    void capturar();
  8.    double calcularImpuesto(double);
  9.    void imprimir(double);
  10.    // Datos miembro
  11.    char nombre [25];
  12.    double tasa;
  13. };
  14. int main(){
  15.  
  16.    impuesto ISV;
  17.    double valor;
  18.  
  19.    ISV.capturar();
  20.    cout << "Valor: ";
  21.    cin >> valor;
  22.  
  23.    ISV.imprimir(valor);
  24.  
  25.    return 0;
  26. }
  27.  
  28. void impuesto::capturar()
  29. {
  30.    cin.ignore();
  31.    cout << "Nombre de impuesto: ";
  32.    cin.getline(nombre, 25);
  33.    cout << "Tasa: ";
  34.    cin >> tasa;
  35. }
  36. void impuesto::imprimir(double v)
  37. {
  38.    cout << "Para un valor de : " << v << " y una tasa de: " << tasa
  39.    << " el valor de " << nombre << " es: " << calcularImpuesto(v) << endl;
  40. }
  41. double impuesto::calcularImpuesto(double v)
  42. {
  43.    return v * tasa;
  44. }
  45.  


Título: Re: duda con cin.ignore()
Publicado por: user-marcos en 22 Agosto 2015, 12:40 pm
Puedes usar algo así:

Código
  1. private static bool inicio;
  2. bool impuesto:: inicio = true;
  3.  
  4. //....
  5.  
  6. if(inicio == true)
  7. inicio = false;
  8. else cin.ignore();
  9.  


Título: Re: duda con cin.ignore()
Publicado por: ivancea96 en 22 Agosto 2015, 13:40 pm
Lo mejor que puedes hacer es no combinar el operador "<<" con "getline".
Utilizar siempre getline es la mejor solución.


Título: Re: duda con cin.ignore()
Publicado por: Mientras en 24 Agosto 2015, 05:02 am
1. Hola, gracias por responder, quisiera saber otras formas?

2. Puedes ser más específico con lo de getline...


Título: Re: duda con cin.ignore()
Publicado por: ivancea96 en 24 Agosto 2015, 13:25 pm
El problema de "cin<<", es que deja saltos de linea en el buffer de entrada sin leer. Cuando tratas de usar getline, coge esos saltos de linea, y no te deja meter datos. Con "cin.ignore()", eliminas esos saltos de linea.

Para leer en consola, te recomiendo usar siempre, salvo casos especiales:
Código
  1. string line;
  2. getline(cin, line);

De ese modo, siempre obtendrás una cadena, y el buffer será limpiado correctamente.

Ahora bien, en caso por ejemplo, de que quieras interpretar la cadena como un entero, tienes las funciones:
Código
  1. int i = stoi(line); // String to int
  2. unsigned long ul = stoul(line); // String to int
  3. long long ll = stoll(line); // String to long long
  4. float f = stof(line); // String to float
  5. double d = stod(line); // String to double
  6. long double ld = stod(line); // String to long double

Son de la librería <string>. Aquí puedes verlas todas: http://www.cplusplus.com/reference/string/ (http://www.cplusplus.com/reference/string/)

De este modo, utilizas siempre getline, y evitas utilizar cin<< y cin.ignore.