Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con getline

Estas en el tema de problema con getline en el foro de C/C++ en Foros del Web. hola a toda la comunidad.. tengo el siguiente codigo c++ Código: # include <iostream> # include <string> using namespace std; void primeraClase(int[]); void claseEconomica(int[]); void ...
  #1 (permalink)  
Antiguo 15/02/2011, 18:37
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
problema con getline

hola a toda la comunidad.. tengo el siguiente codigo c++
Código:
# include <iostream>
# include <string>
using namespace std;
void primeraClase(int[]);
void claseEconomica(int[]);
void imprimirpasaje(string,int,int);
int main ()
{
    const int tamanio=10;
    int cupos[tamanio]={}; //inicializa todo los puestos en 0
    int opcion=0;
    cout<<"\n\n\t Reservacion \n\n"; //menu
    while (opcion!=3)
    {
        cout<<"\n por favor escriba:\n"<<"1 para primera clase";
        cout<<"\n 2 para clase economico";
        cout<<"\n 3 pasa salir";
        cout<<"\n que opcion elige: ";
        cin>>opcion;
        switch(opcion)
        {
            case 1:
            primeraClase(cupos);
            break;
            case 2:
            claseEconomica(cupos);
            break;
            case 3:
            cout<<"\n\n\t Gracias por usar nuestro Servicio\n\n";
            break;
            default:
            cout<<"\n Porfavor escriba una entrada valida \n";
            opcion=0;
        }
    }
    return 0;

}
void primeraClase(int arreglo[])
{

    int a=1; //contador de puestos ocupados
    cout<<"hacientos disponibles: "; //muestra los lugares disponibles
    for (int i=0;i<5;i++)
        {
            if (arreglo[i]==0)
            {
                cout<<i+1<<", ";
            }
            else
            {
                a++;
            }
        }
    if (6==a) //si todos los puestos estan ocupados
    {
        char op;
        cout<<"\n no hay cupo, desea viajar en la clase economica (s/n): "; //propone traslado a clase economica
        cin>>op;
        if (op=='s')
        claseEconomica(arreglo);
        else
        cout<<"\n el proximo vuelo sera dentro de 3 horas \n";
    }
    else //si hay puestos disponibles
    {
        int puesto;
        cout<<"que puesto desea: ";
        cin>>puesto;
        while ((arreglo[puesto-1]==1)||(puesto>5)) //compruba que el puesto este disponible y que sea correcto
        {
            cout<<"\n puesto ocupado o no valido, elija otro: ";
            cin>>puesto;
        }
        arreglo[puesto-1]=1;
        string nom;
        cout<<"\n escriba su nombre: ";
        getline(cin,nom);
        imprimirpasaje(nom,puesto,1);
    }
}
void claseEconomica(int array[])
{
    int a=1; //contador de puestos ocupados
    cout<<"hacientos disponibles: "; //muestra los lugares disponibles
    for (int i=5;i<10;i++)
        {
            if (array[i]==0)
            {
                cout<<i+1<<", ";
            }
            else
            {
                a++;
            }
        }
    if (6==a) //si todos los puestos estan ocupados
    {
        char op;
        cout<<"\n no hay cupo, desea viajar en primeraClase (s/n): "; //propone traslado a primera clase
        cin>>op;
        if (op=='s')
        primeraClase(array);
        else
        cout<<"\n el proximo vuelo sera dentro de 3 horas \n";
    }
    else //si hay puestos disponibles
    {
        int puesto;
        cout<<"que puesto desea: ";
        cin>>puesto;
        while ((array[puesto-1]==1)||(puesto<6)) //compruba que el puesto este disponible y sea correcto
        {
            cout<<"\n puesto ocupado o no valido, elija otro: ";
            cin>>puesto;
        }
        array[puesto-1]=1;
        string nombre;
        cout<<"\n escriba su nombre: ";
        getline(cin,nombre);
        imprimirpasaje(nombre,puesto,2);
    }
}
void imprimirpasaje(string name,int indice,int seccion)
{
    cout<<"\n\n";
    cout<<"================================================"<<endl
        <<"                                                "<<endl
        <<"                   Pasaje                       "<<endl
        <<"                                                "<<endl
        <<"Nombre: "<<name<<"                              "<<endl;
        if (1==seccion)
    cout<<"Sección: Primera Clase                          "<<endl;
        else
    cout<<"Sección: Segunda Clase                          "<<endl;
    cout<<"                                                "<<endl
        <<"Puesto: "<<indice<<"                            "<<endl
        <<"                                                "<<endl
        <<"================================================";
}
el programa me compila bien pero en ejecucion no me lee el nombre (string). es muy raro porque si pongo las instrucciones (declaracion del nombre y lectura) al inicio de main el programa lo lee.. que pude ser??

gracias
  #2 (permalink)  
Antiguo 16/02/2011, 08:03
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con getline

Proba reemplazando estas lineas:
getline(cin,nom);
por esta:
cin >> nom;

El problema esta que cuando ingresas el numero del asciento y tocas enter, las teclas presionadas son dos. el numero y el enter. Cuando llegas al getline como ya esta el enter presionado lee de una la linea entera que esta vacia pero ya se acabo la linea.

usando cin suele ser mas inteligente pero tenes el problema que no captura el nombre entero.
  #3 (permalink)  
Antiguo 16/02/2011, 08:43
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: problema con getline

ahh ok, gracias sam90. hay alguna forma de que lea todo el nombre completo usando algun otro operador?

nota: tienes algun link donde de mas informacion sobre el problema que me dices que tiene el getline:
Cita:
El problema esta que cuando ingresas el numero del asciento y tocas enter, las teclas presionadas son dos. el numero y el enter. Cuando llegas al getline como ya esta el enter presionado lee de una la linea entera que esta vacia pero ya se acabo la linea.

Última edición por cabeto14; 16/02/2011 a las 09:02
  #4 (permalink)  
Antiguo 17/02/2011, 18:34
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: problema con getline

alguien tiene algun link con informacion sobre el problema que tiene getline para saber mas de el y como evitarlo??

gracias
  #5 (permalink)  
Antiguo 17/02/2011, 19:21
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: problema con getline

No es un problema especifico de getline, es mas no lo consideraria un problema. El hecho es que cuando lees una cadena (somo dijo sam) el caracter de salto de linea es el que toma de referencia para dejar de leer una linea. Por lo que los caracteres que se encontraban antes del salto de linea se salen del buffer de entrada dejando el salto de linea ahi. lo unico que debes hacer es vaciar el buffer antes de hacer otra lectura. Yo en lo personal lo hago de la siguiente forma:

Código PHP:
while(getchar() != '\n'); 
Espero te haya aclarado tu duda.
  #6 (permalink)  
Antiguo 18/02/2011, 11:18
 
Fecha de Ingreso: junio-2010
Mensajes: 46
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: problema con getline

ah ok gracias trovaz... como podria buscarlo en google para conocer mas acerca de ese buffer? osea lo que quiero es aprender sobre como c++ realiza esas lecturas y escrituras de datos, como interactua con el buffer..

gracias

Etiquetas: getline
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:10.