Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Omar_2013 en 11 Abril 2014, 01:13 am



Título: Realmente extraño problema con cin.getline
Publicado por: Omar_2013 en 11 Abril 2014, 01:13 am
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
  1.    while (Opcion!=3)
  2.    {
  3.          cout<<"Menu Principal\n\n";
  4.  
  5.          cout<<"1. Ingresar a Facebook";
  6.          cout<<"2. Crear una cuenta"<<endl;
  7.          cout<<"3. Salir\n\n\n";
  8.  
  9.          CharOp=getch();//Lee un caracter sin presionar enter y sin mostrarlo en pantalla
  10.  
  11.          if (CharOp=='1')
  12.          {
  13.             Opcion=1;//Se Decrara para mantener la condicion while principal
  14.             system("cls");
  15.  
  16.             Intentos=0;
  17.             while (Intentos!=3)
  18.             {            
  19.                   gotoxy(30,10);cout<<"Usuario: ";
  20.                   cin.getline(User,10,'\n');
  21.  
  22.                   Validacion=BuscarLista(&ListaUsuarios, User, 1);//Validacion Se Encarga de ver si el Usuario Existe,
  23.                   if ( Validacion==false )
  24.                   {
  25.                      gotoxy(39,12);cout<<"ID no encontrada!!!"<<endl;
  26.                      Sleep(1500);
  27.                      //Borra Los Espacios Incorrectos Para Un Nuevo Intento
  28.                      gotoxy(39,10);cout<<"                         ";
  29.                      gotoxy(39,12);cout<<"                         ";
  30.                      gotoxy(28,10);textcolor(12);cout<<char(219);
  31.                      Intentos+=1;
  32.                   }
  33.                   else
  34.                       Intentos=3;
  35.             }
  36.  
  37.          }
  38.  
  39.          if (CharOp=='2')
  40.          {
  41.             Opcion=2;//Se Decrara para mantener la condicion while principal
  42.  
  43.             cout<<"Nombre: ";
  44.             cin.getline(CuentaNueva.Nombre, 20,'\n');
  45.             cout<<"ID: ";
  46.             cin.getline(CuentaNueva.ID, 10,'\n');
  47.             cout<<"Contrase"<<char(164)<<"a: ";
  48.             cin.getline(CuentaNueva.Contrasenia, 10,'\n');
  49.             cout<<"Genero (M - F): ";//AQUI ESTA EL ERROR????
  50.             cin>>CuentaNueva.Genero;
  51.             cout<<"Edad: ";
  52.             cin>>CuentaNueva.Edad;
  53.             cout<<"Documento: ";
  54.             cin>>CuentaNueva.Documento;
  55.  
  56.             InsertarFinal(&ListaUsuarios, CuentaNueva);
  57.          }
  58.  
  59.          if (CharOp=='3')
  60.             Opcion=3;//Se Decrara para mantener la condicion while principal
  61.  
  62.          system("cls");
  63.    }
  64.  

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


Título: Re: Realmente extraño problema con cin.getline
Publicado por: nolasco281 en 11 Abril 2014, 02:07 am
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 (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 (http://foro.elhacker.net/programacion_cc/funcion_cinignore-t290246.0.html)

saludos espero haberte ayudado y si persisten las dudas pregunta.


Título: Re: Realmente extraño problema con cin.getline
Publicado por: Omar_2013 en 11 Abril 2014, 02:20 am
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


Título: Re: Realmente extraño problema con cin.getline
Publicado por: nolasco281 en 11 Abril 2014, 02:40 am
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.


Título: Re: Realmente extraño problema con cin.getline
Publicado por: Omar_2013 en 11 Abril 2014, 03:20 am
Muy bien muchísimas gracias, lo seguiré revisando

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


Título: Re: Realmente extraño problema con cin.getline
Publicado por: rir3760 en 11 Abril 2014, 05:19 am
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
  1. 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
  1. 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