Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chicainge en 20 Agosto 2014, 00:26 am



Título: fallo al introducir datos!!
Publicado por: chicainge en 20 Agosto 2014, 00:26 am
Hola tengo un problemiya al leer los datos, pongo el nombre y se acaba el programa porque pasa esto?? y otra cosa, el getline es como se introduce una cadena en el string?? GRACIASSS:)

Código:
/*3-Una farmacia desea almacenar sus productos en una estructura. De cada producto hay
que almacenar la siguiente información: código, nombre, descripción (cadena de
caracteres), laboratorio, proveedor, precio y fecha de caducidad. Diseñar la estructura de
datos y un procedimiento que permita introducir los datos de un medicamento en esa
estructura.*/

#include <iostream>

using namespace std;

typedef struct{

unsigned codigo;
char nombre;
string descripcion;
char laboratorio;
char proveedor;
unsigned precio;
unsigned fechacaducidad;

}producto;

typedef producto P[20];

int main(){
 P p;
 cout<<"introduce el producto: "<<endl;
 cout<<"NOMBRE: ";
 cin>>p[0].nombre;
 cout<<endl<<"CODIGO: ";
 cin>>p[0].codigo;
 cout<<endl<<"PRECIO: ";
 cin>>p[0].precio;
 cout<<endl<<"DESCRIPCION: ";
 getline(cin,p[0].descripcion);
 cout<<endl<<"LABORATORIO: ";
 cin>>p[0].laboratorio;
 cout<<endl<<"PROVEEDOR: ";
 cin>>p[0].proveedor;
 cout<<endl<<"FECHA DE CADUCIDAD(INTRODUCIR DIAMESAÑO): ";
 cin>>p[0].fechacaducidad;

}


Título: Re: fallo al introducir datos!!
Publicado por: ivancea96 en 20 Agosto 2014, 01:49 am
Nombre es char, no string. Revisa los tipos.


Título: Re: fallo al introducir datos!!
Publicado por: rir3760 en 20 Agosto 2014, 04:29 am
tengo un problemiya al leer los datos, pongo el nombre y se acaba el programa porque pasa esto?
Porque, como ya te comento ivancea96, el campo nombre debe ser de tipo string, no char. Mismo caso con los campos laboratorio y proveedor.

y otra cosa, el getline es como se introduce una cadena en el string?
El operador ">>" se utiliza para leer y almacenar una palabra en un string, cuando se desea leer una linea de texto se utiliza getline. Esa función la debes utilizar para asegurarte de leer los campos mencionados completos.

Otro detalle importante es el uso intercalado del operador ">>" con getline, el problema ahí es que usualmente el operador ">>" ignora el espacio pero getline no lo hace. La solución es descartar el resto de la linea con, por ejemplo, la función miembro ignore.

Una forma mas sencilla pero que funciona solo en el caso base (cada linea terminada inmediatamente con el avance de linea) es:
Código
  1. cout << "NOMBRE: ";
  2. getline(cin, p[0].nombre);
  3.  
  4. cout << "CODIGO: ";
  5. cin >> p[0].codigo;
  6.  
  7. cout << "PRECIO: ";
  8. cin >> p[0].precio;
  9. cin.get();
  10.  
  11. cout << "DESCRIPCION: ";
  12. getline(cin, p[0].descripcion);
  13.  
  14. cout << "LABORATORIO: ";
  15. getline(cin, p[0].laboratorio);
  16.  
  17. cout << "PROVEEDOR: ";
  18. getline(cin, p[0].proveedor);
  19.  
  20. cout << "FECHA DE CADUCIDAD(INTRODUCIR DIAMESAÑO): ";
  21. cin >> p[0].fechacaducidad;

Por supuesto una vez leas los datos del registro debes hacer algo útil con ellos.

Un saludo