SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: exjoe en Sábado 17 de Marzo de 2007, 05:59

Título: Como Guardar
Publicado por: exjoe en Sábado 17 de Marzo de 2007, 05:59
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....
Título: Re: Como Guardar
Publicado por: JuanK en Sábado 17 de Marzo de 2007, 20:32
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 (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 (http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vccore/html/_core_serialization_topics.asp)
Título: Re: Como Guardar
Publicado por: AnioN en Sábado 17 de Marzo de 2007, 20:58
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.  
Título: Re: Como Guardar
Publicado por: Eternal Idol en Sábado 17 de Marzo de 2007, 21:13
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.  
Título: Re: Como Guardar
Publicado por: exjoe en Domingo 18 de Marzo de 2007, 02:18
Gracias probare lo que me han dado luego les cuento como me va...
Título: Re: Como Guardar
Publicado por: JuanK en Domingo 18 de Marzo de 2007, 18:12
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