// leerdatos.cpp - Definiciones de funciones
#include "leerdatos.h"
using namespace std;

double leerDouble()
{
  cin.exceptions(ios::failbit | ios::badbit);
  double dato = 0.0;
  try
  {
    cin >> dato;
  }
  catch(ios_base::failure& e)
  {
    cout << e.what() << ": dato no válido\n";
    cin.clear();
    cin.ignore(numeric_limits<int>::max(), '\n');
  }
  return dato; // devolver el dato tecleado
}

bool leerDouble(double& dato)
{
  cin.exceptions(ios::failbit | ios::badbit);
  try
  {
    cin >> dato;
    // Eliminar caracteres sobrantes. Por ejemplo <Entrar>.
    cin.ignore(numeric_limits<int>::max(), '\n');
    return true;
  }
  catch(ios_base::failure& e)
  {
    if (cin.eof())
    {
      cin.clear();
      return false; // se pulsó Ctrl+Z
    }
    else
    {
      cout << e.what() << ": dato no válido\n";
      cin.clear();
      cin.ignore(numeric_limits<int>::max(), '\n');
      return leerDouble(dato);
    }
  }
}

bool leerDato(string& dato)
{
  bool v = true;
  cin.exceptions(ios::failbit | ios::badbit);
  try
  {
    getline(cin, dato);  // leer una variable de tipo string
    v = true;
  }
  catch(ios_base::failure& e)
  {
    if (cin.eof())
    {
      cin.clear();
      v = false; // se pulsó Ctrl+Z
    }
  }
  return v;
}

