[C con Clase] Una pequeña duda con los ficheros

Marcos Collado Martín marquitos.mcm en gmail.com
Jue Abr 26 20:49:07 CEST 2012


Steven o Salvador me podeis dar mas información de como utilizar los
punteros a función, o donde puedo encontrar esa informacion, y tambien de
typedef (aunque esto se mas o menos lo que es, es para dar un nombre que se
entienda mejor a las cosas, por ejemplo: typedef int playa; playa pl; ??)

Un saludo y gracias^^

P.D: Y de la informacion de punteros a función que pueda responderme a esta
pregunta por favor: los punteros a funcion se puede utilizar a cualquier
tipo de funcion o solo a void?

El 26 de abril de 2012 16:32, Marcos Collado Martín <marquitos.mcm en gmail.com
> escribió:

> Si,  muchas gracias por la ayuda :) Aun me quedam ucho por aprender de
> C/C++
>
> El 26 de abril de 2012 03:57, Steven Davidson <srd4121 en njit.edu> escribió:
>
> Hola Marcos,
>>
>>
>> On 4/25/2012 5:45 PM, Marcos Collado Martín wrote:
>>
>>> Ok gracias, pero lo que quiero es que esa función la puedan utilizar
>>> varias estructuras diferentes, no solo (en tu caso) stDatos. Por
>>> ejemplo, algo que hizo Salvador antes:
>>> http://paste2.org/p/1995171
>>>
>>>
>> El problema es que lo que hizo Salvador y lo que quieres hacer tú son
>> cosas diferentes. La solución de Salvador se basa en leer cantidades de
>> bytes de un fichero y escribir los bytes en otra parte del mismo fichero.
>>
>> En tu ejemplo, quieres leer la información y luego usarla como si fuese
>> una estructura en particular. Sin embargo, esto va en contra de lo que
>> quieres, porque dices que te interesa que la información leída se use con
>> cualquier estructura en general.
>>
>> Sugiero que la función acepte un puntero a función la cual acepte un
>> puntero genérico para hacer lo que quieras con tal información, sea el tipo
>> que sea. Por ejemplo,
>>
>> typedef void (*PF)( void * );
>>
>> void Intercambia( FILE *fichero, long iz, long de, long bytesPorRegistro,
>> PF pfunc )
>> {
>>  void *reg1, *reg2;
>>
>>  reg1 = malloc(bytesPorRegistro);
>>  reg2 = malloc(bytesPorRegistro);
>>  ...
>>  pfunc( reg1 );
>> }
>>
>> Un ejemplo de una función y estructura sería,
>>
>> struct stAlgo
>> {
>>  char szCad[64];
>>  int num;
>> };
>>
>> void asignar( void *pDatos )
>> {
>>  stAlgo *pReg = (stAlgo *)pDatos;
>>
>>  strcpy( pReg->szCad, "hola mundo" );
>>  pReg->num = 10;
>> }
>>
>> Y ahora podemos invocar 'Intercambia()' así,
>>
>> Intercambia( fichero, a, b, sizeof(stAlgo), asignar );
>>
>> De esta manera, 'Intercambia()' realizará su tarea además de alguna tarea
>> específica, 'asignar()' en este ejemplo, que tratará la información como un
>> tipo particular.
>>
>>
>> En C++, podemos usar plantillas para resolver este mismo problema. Por
>> ejemplo,
>>
>> template< typename T >
>> void Intercambia( FILE *fichero, long iz, long de )
>> {
>>  T reg;
>>
>>  fseek( fi, iz*sizeof(T), SEEK_SET );
>>  fread( &reg, sizeof(T), 1, fi );
>>  ...
>>  reg.memfunc();
>>  reg.memdato = 0;
>> }
>>
>> La usaríamos así,
>>
>> Intercambia< stAlgo >( fichero, a, b );
>>
>>
>> Claro que no todos los tipos T tendrán el mismo nombre de la función
>> miembro, 'memfunc()', ni tampoco el nombre del dato miembro, 'memdato'.
>>
>> La solución para este problema es pasar un puntero a miembro para que
>> pueda acceder a un miembro cualquiera; por ejemplo,
>>
>> template< typename T >
>> void Intercambia( FILE *fichero, long iz, long de, void T::*pfunc() )
>> {
>>  T reg;
>>
>>  fseek( fi, iz*sizeof(T), SEEK_SET );
>>  fread( &reg, sizeof(T), 1, fi );
>>  ...
>>  reg.*pfunc();
>> }
>>
>> Y la usaríamos así,
>>
>> Intercambia( fichero, a, b, &stAlgo::m_asignar );
>>
>>
>> Hay otras soluciones parecidas, pero este tema se complicaría un poco más
>> y el correo-e sería más extenso.
>>
>>
>> Espero que esto aclare un poco más el tema.
>>
>>
>> Steven
>>
>>
>> ______________________________**_________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/**mailman/listinfo/cconclase_**
>> listas.conclase.net<http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net>
>> Bajas: http://listas.conclase.net/**index.php?gid=2&mnu=FAQ<http://listas.conclase.net/index.php?gid=2&mnu=FAQ>
>>
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120426/d0d1b1aa/attachment.html>


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