[C con Clase] pasar estructuras a un parametro generico del metodo de una clase

David Fire ddfire en gmail.com
Mar Oct 20 01:08:34 CEST 2009


tal vez es una burrada lo que pongo pero es gratis :-)
básicamente lo que queres hacer es serializar y desserializar una estrucutra
(o varias)
lo que podes hacer es pasa el puntero a void pero dentro castealo a byte
(unsigned char) y lito
y lo mismo para leerlo pasa un puntero a void que apunta a la estructura y
lees bytes que se meten dentro de la estructura en el mismo orden que fueron
sacados.

David

El 19 de octubre de 2009 15:57, Rubén Calabuig <racalabuig en gmail.com>escribió:

> Gracias por contestar:
>
> Estoy programando en C++.
>
> El problema es que no entiendo cómo utilizar las templates en este
> caso.
>
> El método en cuestión es el siguiente:
>
> //========================================================================
> // METODO    : bool guardarRegistro(void* reg, int tam)
> // ACCION    : Graba un registro en el archivo.
> // PARAMETROS: void* reg --> puntero a la estructura del registro.
> //             int tam   --> tamano en bytes de la estructura.
> // RETORNO   : true = exito / false = fracaso.
> //........................................................................
> // EJEMPLO   :
> //             if(archivo1.guardarRegistro(alumno, sizeof(alumno)))
> //             {
> //               cout << "registro grabado con exito" << endl;
> //             }
> //             else
> //             {
> //               cout << "no pido guardarse el registro" << endl;
> //             }
> //------------------------------------------------------------------------
>
> bool clsArchivo::guardarRegistro(void* reg, int tam)
> {
>  switch(estado)
>  {
>    case CREADO   : arch = fopen(nombre,"ab");
>                    write(reg,tam,1,arch);
>                    fclose(arch);
>                    return true;
>                    break:
>
>    case AGREGAR  :
>    case MODIFICAR: fwrite(reg,tam,,1,arch);
>                    return true;
>                    break:
>
>    default       : return false;
>  }
> }
> //===== FIN METODO =====================================================
>
> ¿pdrías darme una mano?
>
>
> El lun, 19-10-2009 a las 10:46 -0300, David Fire escribió:
> > hola
> > es C o C++?
> > si es C++ proba con templates
> > aparte que error te da?
> > David
> >
> > El 19 de octubre de 2009 09:28, Rubén Calabuig <racalabuig en gmail.com>
> > escribió:
> >         Hola a todos:
> >
> >         Estoy haciendo una clase, "clsArchivo", para instanciar
> >         objetos con
> >         archivos binarios asociados.
> >
> >         La clase tiene tres atributos
> >           FILE* arch;     // puntero a una estructura FILE.
> >           char* nombre;   // puntero a una cadena generada
> >         dinamicamente para
> >                           // contener el nombre del archivo en disco.
> >           tEstado estado; // estado actual del archivo
> >
> >         NOTA: tEstado es una enumeracion declarada de la siguiente
> >         forma:
> >
> >         enum tEstado{DESASIGNADO,INDETERMINADO,INEXISTENTE,
> >                     CREADO,LEER,AGREGAR,MODIFICAR,CERRADO};
> >
> >
> >         Tods los métodos de acción sobre el archivo asociado,
> >         funcionan a la
> >         perfección, pero el problema se plantea cuando intento
> >         desarrollar
> >         métodos, que reciban como parámetros a estructuras que deben
> >         ser
> >         escritas o leidas.
> >
> >         No puedo pasar un formato específico de estructura, ya que si
> >         así lo
> >         hiciera, mi clase no sería generérica. Entonces, pensé en
> >         utilizar
> >         punteros de tipo void pero no les encuentro la vuelta, de
> >         cualquier
> >         forma que los escriba, me dan error.
> >
> >         Aclaro que estoy programando en el IDE Code::Blocks con el
> >         compilador
> >         gcc, tanto para entorno Windows como par Linux.
> >
> >         Un ejemplo de prototipo sería el siguiente:
> >
> >         tEstado clsArchivo::guardarRegistro(void* reg, int tam)
> >
> >         Donde:
> >              void* reg --> es el puntero a la estructura.
> >              int tam   --> es el tamaño de la estructura.
> >
> >         La pregunta concreta es cómo debe ser la función fwrite o
> >         fread, yo
> >         intenté lo siguiente:
> >
> >         fread(reg,tam,1,arch)
> >
> >         Pero me da error.
> >
> >         Desde ya muchas gracias.
> >
> >
> >         --
> >         Rubén Alberto Calabuig
> >
> >
> >
> >         _______________________________________________
> >         Lista de correo Cconclase Cconclase en listas.conclase.net
> >
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> >         Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> >
> >
> >
> > --
> > (\__/)
> > (='.'=)This is Bunny. Copy and paste bunny into your
> > (")_(")signature to help him gain world domination.
> >
> > _______________________________________________
> > Lista de correo Cconclase Cconclase en listas.conclase.net
> >
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> --
> Rubén Alberto Calabuig
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
(\__/)
(='.'=)This is Bunny. Copy and paste bunny into your
(")_(")signature to help him gain world domination.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20091019/b62914d3/attachment.html>


Más información sobre la lista de distribución Cconclase