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

Rubén Calabuig racalabuig en gmail.com
Mie Oct 21 14:24:56 CEST 2009


David, la burrada fue mia, ya lo solucioné, gracias por tu ayuda.

El lun, 19-10-2009 a las 20:08 -0300, David Fire escribió:
> 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. 
> 
> 
> _______________________________________________
> 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






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