Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Guayavas en 8 Octubre 2017, 06:02 am



Título: Ayuda error con la función getline
Publicado por: Guayavas en 8 Octubre 2017, 06:02 am
Hola que tal a todos los que leen esto les doy gracias de antemano por tomarse su tiempo y en especial si pueden responder a unas cuantas preguntas que tengo sobre un código que hice en c++ se los agradecía de corazón   ;-)

el cual es este:
Código
  1. #include<iostream>
  2. #include<string>
  3. #include<conio.h>
  4. using namespace std;
  5. struct informacion
  6. {
  7. char nombre[20],sex[5];
  8. int edad;
  9. }persona[10];
  10.  
  11. int main()
  12. {
  13.  
  14. int participantes;
  15. cout<<"DIGITE NUMERO DE PARTICIPANTES\n";
  16. cin>>participantes;
  17. cin.ignore();//1 Problema
  18. for(int i=0;i<participantes;i++)
  19. {
  20. cout<<"Ingrese datos de participante N-"<<i+1<<endl;
  21.         cout<<"Digite su nombre"<<endl;
  22. cin.getline(persona[i].nombre,20,'\n');//2 problema
  23. cout<<"Digite su edad"<<endl;
  24. cin>>persona[i].edad;
  25. cin.ignore();//1 problema
  26. cout<<"Digite su sexo"<<endl;
  27. cin.getline(persona[i].sex,5,'\n');//2 problema
  28. }
  29. system("cls");
  30. for(int i=0;i<participantes;i++)
  31. {
  32. cout<<"Datos de participante N-"<<i+1<<endl;
  33.    cout<<persona[i].nombre<<endl;
  34. cout<<persona[i].edad<<endl;
  35. cout<<persona[i].sex<<endl;
  36. }
  37. system("pause");
  38. }
  39.  

el cual sirve para almacenar las información de n personas e imprimirla pero cuando estaba realizándolo me surgieron 2 problemas :
(1 problema)A este le halle solución pero quisiera saber si hay otra forma de solucionar este problema no me gusta como queda ese "cin.ignore();"    ;D
(2 problema) cuando coloco mas de los caracteres máximos que este puede almacenar este rompe el ciclo y no pide mas información  :(


Título: Re: Ayuda error con la función getline
Publicado por: ivancea96 en 8 Octubre 2017, 11:50 am
Acerca del ignore: Cuando haces "cin << int", como el salto de línea que introduces no es una cifra, lo deja en el stream de entrada, con lo cual hay que ignorarlo manualmente. Una opción es leer siempre con getline y transformar a un número con, por ejemplo, stoi(): http://www.cplusplus.com/reference/string/stoi/ (http://www.cplusplus.com/reference/string/stoi/)
Podrías hacer una función que llamarías: "readInt(cin)" por ejemplo.

Acerca del segundo problema, te cito la referencia de la función getline, en el apartado en el que explica la variable "n", el tamaño del buffer: http://www.cplusplus.com/reference/istream/istream/getline/ (http://www.cplusplus.com/reference/istream/istream/getline/)
Citar
If the function stops reading because this limit is reached without finding the delimiting character, the failbit internal flag is set.
Por lo tanto, "cin" se colocará en un estado de error. Esto hace que cualquier intento de leer entrada por ahí falle (de ahí que no te vuelva a preguntar nada). Si quieres saber si falló por esto, comprueba la flag "fail": "if(cin.fail())".
Para que el stream vuelva a funcionar de manera natural, "cin.clear()", que limpia esas flags.
Aquí, como opinión personal, te diría que en lo posible, intentes evitar trabajar con arrays de caracteres y trabajes siempre con strings. Si quieres limitar el tamaño de una string a 20, basta que hagas un "substring(0, 20)" para truncarla. No es que los arrays de char sean malos, pero puedne complicar un poco las cosas. Evidentemente, si estás trabajando con ellos por practicar o algo así, no problem.