duda con cin.ignore()

Iniciado por Mientras, 22 Agosto 2015, 05:20 AM

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

Mientras

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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;
class impuesto
{
public:
   // Funciones miembro
   void capturar();
   double calcularImpuesto(double);
   void imprimir(double);
   // Datos miembro
   char nombre [25];
   double tasa;
};
int main(){

   impuesto ISV;
   double valor;

   ISV.capturar();
   cout << "Valor: ";
   cin >> valor;

   ISV.imprimir(valor);

   return 0;
}

void impuesto::capturar()
{
   cin.ignore();
   cout << "Nombre de impuesto: ";
   cin.getline(nombre, 25);
   cout << "Tasa: ";
   cin >> tasa;
}
void impuesto::imprimir(double v)
{
   cout << "Para un valor de : " << v << " y una tasa de: " << tasa
   << " el valor de " << nombre << " es: " << calcularImpuesto(v) << endl;
}
double impuesto::calcularImpuesto(double v)
{
   return v * tasa;
}

user-marcos

Puedes usar algo así:

Código (cpp) [Seleccionar]

private static bool inicio;
bool impuesto:: inicio = true;

//....

if(inicio == true)
inicio = false;
else cin.ignore();

ivancea96

Lo mejor que puedes hacer es no combinar el operador "<<" con "getline".
Utilizar siempre getline es la mejor solución.

Mientras

1. Hola, gracias por responder, quisiera saber otras formas?

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

ivancea96

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 (cpp) [Seleccionar]
string line;
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 (cpp) [Seleccionar]
int i = stoi(line); // String to int
unsigned long ul = stoul(line); // String to int
long long ll = stoll(line); // String to long long
float f = stof(line); // String to float
double d = stod(line); // String to double
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/

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