Duda con una lectura de teclado en c++

Iniciado por dato000, 27 Diciembre 2013, 23:45 PM

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

dato000

Buenas gente, feliz navidad espero que la esten pasando bien

Miren, mirando a ratos problemas, pues me encontre con algo muy curioso con la lectura de datos en C++.

No entiendo porque ocurre lo siguiente:



Básicamente no se como hacer para leer correctamente los datos de y limpiar el buffer entrada, como siempre recomiendan NO USAR fflush(stdin), debe ser un problema con cin.getline, pero en definitiva no se que usar para leer cadenas que tengan el espacio, para leer nombres completos.

Les agradeceria su ayuda con esta duda.

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct Nadador
{
    char nombre[30];
    int edad;
    char prueba[20];
    double tiempo;
};

typedef struct Nadador datosNadador;

int main()
{
    datosNadador nuevosDatos;
    datosNadador *p_nuevosDatos;

    p_nuevosDatos = &nuevosDatos;

    cout << "************** Problema 11.3 **************" << endl << endl;

    cout << "Digite el nombre del nadador:  "; cin.getline(p_nuevosDatos->nombre, 30, '\n');
    cout << "Nombre del nadador:  " << p_nuevosDatos->nombre << endl << endl;

    cout << "Digite la edad del nadador:  "; cin >> p_nuevosDatos->edad;
    cout << "Edad del nadador:  " << p_nuevosDatos->edad << endl << endl;

    cout << "Digite la prueba que hizo el nadador:  "; cin.getline(p_nuevosDatos->prueba, 20, '\n');
    cout << "Nombre de la prueba:  " << p_nuevosDatos->prueba << endl << endl;;

    cout << "Digite el tiempo de la prueba:  "; cin >> p_nuevosDatos->tiempo;
    cout << "Tiempo realizado en la prueba:  " << p_nuevosDatos->nombre << endl << endl;;

    return 0;
}





amchacon

Después del cin, tienes que poner un cin.ignore() si después vas a usar un getline().

La razón es porque el cin se deja el salto de linea cin coger, asi que te lo tienes que saltar con el .ignore().
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

dato000

 :-( :-( no me funciono, el cin.ignore() solo parece que se usa para un doble salto de linea.  :silbar: :silbar:



sigo sin entender porque no guardar o imprime correctamente los datos que necesito, en C con fgets, fscanf y fprint lo puedo hacer sin problemas, pero quisiera saber porque no funciona igual con cin y cout, raro, pensaba que no tendria estos problemas.




leosansan

Cita de: dato000 en 27 Diciembre 2013, 23:45 PM

Básicamente no se como hacer para leer correctamente los datos de y limpiar el buffer entrada, como siempre recomiendan NO USAR fflush(stdin), debe ser un problema con cin.getline, pero en definitiva no se que usar para leer cadenas que tengan el espacio, para leer nombres completos.

Les agradeceria su ayuda con esta duda.
.......................................

La verdad que la limpieza del buffer empieza a ser un martirio. He aquí una salida:


Añadir un simple while:

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>

using namespace std;

struct Nadador
{
    char nombre[30];
    int edad;
    char prueba[20];
    double tiempo;
};

typedef struct Nadador datosNadador;

int main()
{

    datosNadador nuevosDatos;
    datosNadador *p_nuevosDatos;

    p_nuevosDatos = &nuevosDatos;

    cout << "************** Problema 11.3 **************" << endl << endl;

    cout << "Digite el nombre del nadador:  "; cin.getline(p_nuevosDatos->nombre, 30, '\n');
    cout << "Nombre del nadador:  " << p_nuevosDatos->nombre << endl << endl;

    cout << "Digite la edad del nadador:  "; cin >> p_nuevosDatos->edad;
    while (getchar ()!='\n');
    cout << "Edad del nadador:  " << p_nuevosDatos->edad << endl << endl;

    cout << "Digite la prueba que hizo el nadador:  "; cin.getline(p_nuevosDatos->prueba, 20, '\n');
    cout << "Nombre de la prueba:  " << p_nuevosDatos->prueba << endl << endl;;

    cout << "Digite el tiempo de la prueba:  ";cin >> p_nuevosDatos->tiempo;
    cout << "Tiempo realizado en la prueba:  " << p_nuevosDatos->tiempo << endl << endl;;

    return 0;
}


;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!




amchacon

Cita de: dato000 en 28 Diciembre 2013, 00:15 AM
:-( :-( no me funciono, el cin.ignore() solo parece que se usa para un doble salto de linea.  :silbar: :silbar:
No no, el cin.ignore después de un cin (que preceda a un getline):

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>

using namespace std;

struct Nadador
{
   char nombre[30];
   int edad;
   char prueba[20];
   double tiempo;
};

typedef struct Nadador datosNadador;

int main()
{

   datosNadador nuevosDatos;
   datosNadador *p_nuevosDatos;

   p_nuevosDatos = &nuevosDatos;

   cout << "************** Problema 11.3 **************" << endl << endl;

   cout << "Digite el nombre del nadador:  "; cin.getline(p_nuevosDatos->nombre, 30, '\n');
   cout << "Nombre del nadador:  " << p_nuevosDatos->nombre << endl << endl;

   cout << "Digite la edad del nadador:  "; cin >> p_nuevosDatos->edad;

   cin.ignore();

   cout << "Edad del nadador:  " << p_nuevosDatos->edad << endl << endl;

   cout << "Digite la prueba que hizo el nadador:  "; cin.getline(p_nuevosDatos->prueba, 20, '\n');
   cout << "Nombre de la prueba:  " << p_nuevosDatos->prueba << endl << endl;;

   cout << "Digite el tiempo de la prueba:  ";cin >> p_nuevosDatos->tiempo;
   cout << "Tiempo realizado en la prueba:  " << p_nuevosDatos->tiempo << endl << endl;;
   cin.ignore();

   return 0;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

Cita de: amchacon en 28 Diciembre 2013, 00:50 AM
No no, el cin.ignore después de un cin (que preceda a un getline):
.......................

Perfecto, hace el mismo uso que el while pero más de C++.


dato000

#6
Que raro, no me funciono con la de leo, incluso inclui dos while para estar seguro, me salio esto...




Más extraño aún con la de amchacon sucede lo mismo...



Extraño, pero creo que ya voy entendiendo, no dejo código porque estuve usando datos estaticos que grabe desde una estructura, es decir, me invente mis propios datos sin tomar entrada de teclado, así que quedaría mucho código sin relación al problema original, esto es más una curiosidad sobre cin y cout.

slds gracias por su ayuda gente.

Que podría estar pasando?? el compilador es gcc y uso codeblocks, no creo que sea un problema de eso no??



leosansan

#7
Cita de: dato000 en 28 Diciembre 2013, 01:26 AM
Que raro, no me funciono con la de leo, incluso inclui dos while para estar seguro, .......................................................

Que podría estar pasando?? el compilador es gcc y uso codeblocks, no creo que sea un problema de eso no??

Como vistes por el pantallazo, a mí si me funciono, tanto el mío como el de amchacon. Tal vez deberías actualizar la versión del Code::Blocks.

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:




dato000

Cierto, actualice mi codeblocks, y funciona perfectamente.


Muchas gracias




leosansan

Cita de: dato000 en 28 Diciembre 2013, 15:31 PM
Cierto, actualice mi codeblocks, y funciona perfectamente.


Muchas gracias




¡¡¡Me encantan que los planes salgan bien !!!

Saluditos! ..... !!!!