Ver Mensaje Individual
  #4 (permalink)  
Antiguo 11/01/2012, 08:33
starfix
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 12 años, 11 meses
Puntos: 25
Respuesta: no se guardan los datos en el archivo binario

volviendo a retornar esto, lo habia dejado y avanzado con otras cosa pero ahora necesito solucionarlo bien....

ahora el problema no se si es que no se guardan los datos o los leo mal.

para guardar uso el siguiente codigo:

Código C++:
Ver original
  1. bool Lista_Producto::Guardar_Lista(){
  2.  
  3. if (FILE *Archi= fopen("datos.dat", "wb")){
  4.  
  5. Producto *Aux= this->__Primero;
  6. Producto_Auxiliar PR;
  7.  
  8.  
  9. while (Aux){
  10.  
  11. //se le asigna al struct PR los datos que se van a almacenar
  12. PR.Nombre= Aux->__Nombre;
  13. PR.Tipo= Aux->__Tipo;
  14. PR.SubTipo= Aux->__SubTipo;
  15. PR.Precio= Aux->__Precio;
  16.  
  17. //se guarda en el archivo los datos
  18. fwrite(&PR, sizeof PR, 1, Archi);
  19.  
  20. Aux= Aux->__Siguiente;
  21. }
  22.  
  23. fclose(Archi);
  24. }else return 0;
  25. return 1;
  26. };

y para cargar:

Código C++:
Ver original
  1. bool Lista_Producto::Cargar_Lista(){
  2.  
  3. unsigned long int Tamanio;
  4.  
  5. if (FILE *Archi= fopen("datos.dat", "rb")) {
  6.  
  7. //se obtiene el tamaño del archivo
  8. fseek(Archi, 0, SEEK_END);
  9. Tamanio= ftell(Archi);
  10.  
  11. //se retorna el puntero al principio del archivo
  12. rewind(Archi);
  13.  
  14.  
  15. Producto_Auxiliar PR;
  16.  
  17.  
  18. while (Tamanio != 0){
  19.  
  20. //se lee del archivo un bloque y se guarda en PR
  21. fread(&PR, sizeof PR, 1, Archi);
  22.  
  23. //se crea un nuevo producto a partir de los datos leidos
  24. this->Nuevo(PR.Nombre, PR.Precio, PR.Tipo, PR.SubTipo);
  25.  
  26. //esta parte no se si esta bien, segun lo que entiendo en algun
  27. //momento tendria que llegar a cero y no pasarse
  28. Tamanio-= sizeof Producto_Auxiliar;
  29. }
  30. }else return 0;
  31.  
  32. return 1;
  33. }

el struct Producto_Auxiliar tiene la siguiente forma:

Código C++:
Ver original
  1. struct Producto_Auxiliar{UnicodeString Nombre, Tipo, SubTipo;
  2. float Precio;};


Segun los ejemplos que encontre a traves de internet esto tendria que funcionar, pero no....

Cuando ejecuto Guarda_Lista se crea el archivo "datos.dat" con un tamaño de 16 bytes.... al tratar de leerlo con Cargar_Lista, no lo hace, a veces se lee la variable Precio pero las demas quedan vacias, es decir, Nombre, Tipo y SubTipo son cadenas vacias, y esto me ocasiona problemas cuando trato de crear un nuevo Producto en la linea 24 de Cargar_Lista