C/Visual C - grabando objetos

 
Vista:

grabando objetos

Publicado por manuel (16 intervenciones) el 09/02/2005 09:29:19
alguien que me indique una direccion o una explicacion de como puedo grabar un objeto C++ en un file (sin que sea el metodo relacional, sino, objeto puro). Es mas, y si tuviera varios objetos de la MISMA clase y como los puedo grabar y recuperar.
Para poner un ejemplo, tengo una orden de compras (clase orden) y sus respectivos items (clase item).
Alguna sugerencia?

saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:grabando objetos

Publicado por chuidiang (677 intervenciones) el 09/02/2005 14:32:36
Bueno, se me ocurren varias opciones.

Una opcion chapucera que te puede funcionar si la clase no tiene demasiadas herencias, metodos virtuales y demás es tratar la clase como si fuera una estructura de datos.

orden a;
FILE *f = fopen ("fichero", "w");
fwrite (&a, sizeof(a), 1, f);

La opción buena es hacer que la clase tenga metodos write() y read() en los que reciba un int (descriptor de fichero que se optiene con open()). En esos metodos la clase debe escribirse o leerse del descriptor de fichero que le pasan.

Cuando quieras escribir haces eso
int f = open ("fichero", "w");
orden a;
a.write (f);

Estas funciones de fichero son de C (es a las que estoy acostumbrado). Supongo que tienes sus variantes con streams de C++.

Otra opción más es hacer que la clase tenga dos funciones amigas:

istream &operator >> (istream &in, orden a);
ostream &operator << (ostream &out, orden a);

Y haces estas dos funciones para que escriban/lean los atributos de la clase en el ostream o istream. Si haces esto, luego puedes hacer cosas como esta

fstream fichero = ...;
orden a, b;
fichero << a;
fichero >> b;

Perdona si hay errores de nombres con los stream, pero ya te digo que no estoy acostumbrado a ellos.

En http://www.geocities.com/chuidiang/sobrecarga/sobrecarga.html tienes un ejemplo de esta ultima opción de sobrecargar el operator << y operator >> hecha con una clase tonta NumeroComplejo

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por manuel (16 intervenciones) el 09/02/2005 15:02:03
entiendo lo que me quieres explicar, mas, eso me lleva a usar bases de datos relacionales?.

me explico, segun he leido que cuando guardas el objeto, lo guardas como un *todo*; en el caso, la orden con sus items(de ser posible, todo junto), en el supuesto caso de guardar las ordenes y los items en archivos separados, necesitare un link o puntero; o sea, una relacion, lo cual no quiero, porque sino tendree que tener llaves para todo lo que sea necesario y para reconstruir el objeto no solo necesitaree instanciarlo, sino tambien, leer los archivos con los que tiene relacion(para reconstruirlo).

mira, estuve probando grabar la orden con sus items pero solo lo puedo hacer en un solo archivo, es decir, un objeto=un archivo, lo cual no me parece adecuado.
Ahora, si grabara varias ordenes (con sus items) en un archivo, tendre ordenes de tamanios distintos (por los items), y la chapucera (como dices) se me viene cuando quiera eliminar o agregar un item a la orden. Entonces no me queda sino separar items y ordenes y unirlos por llaves.

alguna otra sugerencia

saludos

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por chuidiang (677 intervenciones) el 10/02/2005 06:30:20
Bueno:

Lo primero es saber si quieres guardar los objetos en una base de datos o en un fichero.

Si usas un fichero, desde luego estás más limitado y si la aplicación es compleja (muchos tipos de objetos distintos, enlaces entre ellos,e tc) tienes un trabajo importante de gestión de esos ficheros. Por ejemplo, puedes guardar un tipo de fichero por cada tipo de objeto, aunque puedes guardar muchos objetos del mismo tipo en un solo fichero. Luego tendrás que hacer algo para relacionar unos objetos con otros.

Para aplicaciones complejas es mejor bases de datos, en el que por ejemplo cada tabla puede representar un objeto y puedes añadir fácilmente enlaces entre ellas.

Si no quieres una base de datos relacional, ahi se me escapa el tema, pero sé que existen bases de datos de objetos.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por manuel (16 intervenciones) el 10/02/2005 12:58:02
concuerdo contigo, mas que quieres decir con "Por ejemplo, puedes guardar un tipo de fichero por cada tipo de objeto"?

y gracias de todas formas. Continuaree investigando...
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por Nicolas (183 intervenciones) el 10/02/2005 13:36:00
Lo q quiere decir, supongo, es que vos vas a guardar distintas clases en distintos archivos y no se pueden mezclar porque como te dijo chuidiang, cada clase tiene su metodo write() y read() y recibe el file descriptor al cual hacer el write y read, pero deberias saber de q forma fue guardado para saber como levantar el archivo, es decir, en un mismo archivo, no se pueden guardar distintos tipos de objetos (SI se puede verdaderamente) porque cuando lo quieras leer no sabras cuanto moverte y esas cosas.
Es medio dificil de explicar, pero la consclusion es: 1 archivo por cada clase q se guarde a disco

Salu2""""""""""""
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por chuidiang (677 intervenciones) el 11/02/2005 22:28:30
Efectivamente, me refiero a eso.

Las cosas que guardes en un fichero deben ser del mismo tamaño, si no quieres complicarte la vida. Por ello, si tienes clases Cliente y clases Venta, entonces necesitas dos ficheros. En uno guardas todos los Cliente que tengas y en otro todos los Venta.

Si lo haces con base de datos, al final viene a ser lo mismo, solo que en vez de ficheros, usas tablas de la base de datos.

Si tu programa tiene cuatro clases de las cuales habrá unas pocas instancias, te valdrá con los ficheros. Sin embargo, si tienes 200 clases distintas, con muchas instancias cada una y muy relacionadas unas con otras, una base de datos te ahorrará mucho trabajo.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:grabando objetos

Publicado por manuel (16 intervenciones) el 13/02/2005 11:37:39
valioo la aclaracion...
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar