• Sábado 14 de Diciembre de 2024, 23:38

Autor Tema:  Como Guardar  (Leído 1544 veces)

exjoe

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Como Guardar
« en: Sábado 17 de Marzo de 2007, 05:59 »
0
hola, se que lei por aqui en algun lado como guardar comoponentes creadas en timpo de ejecucion hace algun tiempo pero ya llevo buen rato buscando y nada no doy con ello, si alguien sabe....

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como Guardar
« Respuesta #1 en: Sábado 17 de Marzo de 2007, 20:32 »
0
Código: Text
  1. class prueba
  2. {
  3.   ...
  4.   void funcion()
  5.   {
  6.     Componente *c = new Componente();
  7.     FILE *arch;
  8.     arch = fopen("este.o", wb+);
  9.     fwrite(c, sizeof(*c), 1, arch);
  10.   }
  11.   ...
  12. }
  13.  

esa es la idea basica y funciona si Componente solo tiene tipos por valor, el problema radica en que attributos tiene la clase componente... si tiene tipos por referencia sera mas complicado pues nada ganas con restaurar punteros para los cuales ya no tienes acceso y cometerías una infracción de memoria.


http://www.functionx.com/cpp/articles/serialization.htm


Esto puede ser muy util para hacer lo que quieres:

http://msdn.microsoft.com/library/spa/defa...tion_topics.asp
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Como Guardar
« Respuesta #2 en: Sábado 17 de Marzo de 2007, 20:58 »
0
del codigo que aparece en el link 1 no entiendo esta linea:

Código: Text
  1.   ofs.write((char *)&one, sizeof(one));
  2.  
mas especificamente el primer argumento. Este es el codigo completo del ejemplo.

Código: Text
  1. class Student
  2. {
  3. public:
  4.   char   FullName[40];
  5.   char   CompleteAddress[120];
  6.   char   Gender;
  7.   double Age;
  8.   bool   LivesInASingleParentHome;
  9. };
  10.  
  11. int main()
  12. {
  13.   Student one;
  14.  
  15.   strcpy(one.FullName, "Ernestine Waller");
  16.   strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910");
  17.   one.Gender = 'F';
  18.   one.Age = 16.50;
  19.   one.LivesInASingleParentHome = true;
  20.  
  21.   ofstream ofs("fifthgrade.ros", ios::binary);
  22.  
  23.   ofs.write((char *)&one, sizeof(one));
  24.  
  25.   return 0;
  26. }
  27.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Como Guardar
« Respuesta #3 en: Sábado 17 de Marzo de 2007, 21:13 »
0
El punto esta en escribir desde la direccion de memoria donde esten los datos que queremos el tamaño de estos mismos y para eso usamos sizeof.

Cuidado con el ejemplo de JuanK que no es del todo correcto ya que esta haciendo sizeof de c y al ser este un puntero nos devuelve el tamaño del mismo (4 en 32 bits, 8 en 64 bits) y no el tamaño de la estructura a la que apunta. Por eso yo siempre recomiendo usar directamente el tipo y no el puntero (tambien se puede hacer sizeof del puntero).

Código: Text
  1.  
  2. fwrite(c, sizeof(*c), 1, arch);
  3. fwrite(c, sizeof(Componente), 1, arch);
  4.  
  5.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

exjoe

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Como Guardar
« Respuesta #4 en: Domingo 18 de Marzo de 2007, 02:18 »
0
Gracias probare lo que me han dado luego les cuento como me va...

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como Guardar
« Respuesta #5 en: Domingo 18 de Marzo de 2007, 18:12 »
0
Cita de: "Eternal Idol"
El punto esta en escribir desde la direccion de memoria donde esten los datos que queremos el tamaño de estos mismos y para eso usamos sizeof.

Cuidado con el ejemplo de JuanK que no es del todo correcto ya que esta haciendo sizeof de c y al ser este un puntero nos devuelve el tamaño del mismo (4 en 32 bits, 8 en 64 bits) y no el tamaño de la estructura a la que apunta. Por eso yo siempre recomiendo usar directamente el tipo y no el puntero (tambien se puede hacer sizeof del puntero).

Código: Text
  1.  
  2. fwrite(c, sizeof(*c), 1, arch);
  3. fwrite(c, sizeof(Componente), 1, arch);
  4.  
  5.  
:o tienes razón no me había fijado, ya lo corregi.

Código: Text
  1.   ofs.write((char *)&one, sizeof(one));
  2.  

Esta escribiendo el objeto one en disco, pero dado que el método write solo recibe como parámetro un char * le están haciendo un cast, adicionalmente la función recibe un puntero no un objeto así que lo que se hace con &one es pasar un puntero al objeto no un objeto completo, y lo complementan con el cast (char *) para que el metodo reciba el tipo de puntero requerido
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io