Realmente extraño problema con cin.getline

Iniciado por Omar_2013, 11 Abril 2014, 01:13 AM

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

Omar_2013

Hola Buenas, el problema es que en mi código en la LINEA 20,cin.getline pasa de largo y no ejecuta la instrucción de leer, ya he depurado el código con Dev C++ pero es realmente extraño.

El error ÚNICAMENTE SUCEDE al escoger primero la opción 2 y después intentar con la 1.

Aquí esta la porción de código.
Código (cpp) [Seleccionar]

   while (Opcion!=3)
   {
         cout<<"Menu Principal\n\n";
         
         cout<<"1. Ingresar a Facebook";
         cout<<"2. Crear una cuenta"<<endl;
         cout<<"3. Salir\n\n\n";
         
         CharOp=getch();//Lee un caracter sin presionar enter y sin mostrarlo en pantalla
         
         if (CharOp=='1')
         {
            Opcion=1;//Se Decrara para mantener la condicion while principal
            system("cls");
                         
            Intentos=0;
            while (Intentos!=3)
            {            
                  gotoxy(30,10);cout<<"Usuario: ";
                  cin.getline(User,10,'\n');
           
                  Validacion=BuscarLista(&ListaUsuarios, User, 1);//Validacion Se Encarga de ver si el Usuario Existe,
                  if ( Validacion==false )
                  {
                     gotoxy(39,12);cout<<"ID no encontrada!!!"<<endl;
                     Sleep(1500);
                     //Borra Los Espacios Incorrectos Para Un Nuevo Intento
                     gotoxy(39,10);cout<<"                         ";
                     gotoxy(39,12);cout<<"                         ";
                     gotoxy(28,10);textcolor(12);cout<<char(219);
                     Intentos+=1;
                  }
                  else
                      Intentos=3;
            }
             
         }
               
         if (CharOp=='2')
         {
            Opcion=2;//Se Decrara para mantener la condicion while principal

            cout<<"Nombre: ";
            cin.getline(CuentaNueva.Nombre, 20,'\n');
            cout<<"ID: ";
            cin.getline(CuentaNueva.ID, 10,'\n');
            cout<<"Contrase"<<char(164)<<"a: ";
            cin.getline(CuentaNueva.Contrasenia, 10,'\n');
            cout<<"Genero (M - F): ";//AQUI ESTA EL ERROR????
            cin>>CuentaNueva.Genero;
            cout<<"Edad: ";
            cin>>CuentaNueva.Edad;
            cout<<"Documento: ";
            cin>>CuentaNueva.Documento;
   
            InsertarFinal(&ListaUsuarios, CuentaNueva);
         }
             
         if (CharOp=='3')
            Opcion=3;//Se Decrara para mantener la condicion while principal
       
         system("cls");
   }


Si no me hago entender por favor descarguen el ejecutable
https://mega.co.nz/#!Btx2URJb!Dsr7oOEZx5RfvQkVlEAAv5gSw40uD2FEw-Uxh1mQJ9I

Aqui el link del codigo
https://mega.co.nz/#!owZQHZjB!QLbJo-EUYFfucYX2Mnn2GoBqzA56PLwqa1BYo4996Fs

nolasco281

#1
Hola tu imagen no se ve muy bien de que es lo que sucede en el programa.

Pero si no me equivoco como ya se habia visto en otro hilo parecido a esto
http://foro.elhacker.net/programacion_cc/buenas_otra_vez_jaja_tengo_un_problema_con_programa-t412011.0.html

el problema que tenia el era con el cin.getline tambien

que significa el cin.ingore();
http://foro.elhacker.net/programacion_cc/funcion_cinignore-t290246.0.html

saludos espero haberte ayudado y si persisten las dudas pregunta.
Lo que se puede imaginar... se puede programar.

Omar_2013

#2
Gracias por responder nolasco281, la verdad no he podido, pero ya he subido el link para que descargues el ejecutable y te des cuenta del error

nolasco281

#3
Tranquilo amigo con que comentes o pongas como el codigo como lo histe en el primer comentario esta bien.

El problema creo que debe de estar en la opcion 1 ya que es la que trata de recuperar los datos y no lo hace como debe.

Dejame lo veo. Si no alquien mas te ayudara : ) seguro no lo dudes.

Disculpa que te conteste hasta horita pero no tengo la libreria conio2 y tu problema es la momento al momento de guardar los datos ya que si ingresas un registro y luego ingresas a la opcion 1 se genera un problema.

pero si ingresas un registro y luego ingresas otro no lo ingresa pero se entras a la primera opcion el programa sique sin ningun proble y sin pedirte datos.

lamento no poder ejecutarlo por la libreria y por otros motivos deL S.O.

Pero rebisa tus metodos de como se guardan los datos (registros) si puedo consequir otra pc espero poder ayudarte.

saludos sequire intentadolo.
Lo que se puede imaginar... se puede programar.

Omar_2013

#4
Muy bien muchísimas gracias, lo seguiré revisando

Definitivamente no   :-( :-( :-( no lo encuentro

rir3760

Como ya te comento nolasco281 ese comportamiento se debe al uso intercalado de cin y getline.

La opcion 2 termina con la sentencia:
Código (cpp) [Seleccionar]
cin >> CuentaNueva.Documento;
Ahí el avance de linea (el carácter '\n') se queda en el bufer de la entrada estándar.

La opcion 1 inicia con la sentencia:
Código (cpp) [Seleccionar]
cin.getline(User, 10, '\n');
Ahí el carácter '\n' (dejado por la sentencia anterior) se toma como una linea en blanco.

La solución es, después del uso de cin, utilizar un bucle para descartar el resto de linea o bien llamar a la función sync o ignore. Ejemplos sobre ello los puedes revisar mediante el motor de búsqueda de los foros.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language