[C con Clase] Funciones Genericas(parametro structura) Error

Steven Davidson steven en conclase.net
Mie Jun 13 20:16:23 CEST 2007


Hola Luis,

El pasado 2007-06-13 15:29:13, Luis escribió:

L> hola buenas tardes un favor amigo, tengo problemas para hacer funcinar esto aver si puedes ayudarme te lo voy agradecer.
L>  
L> lo que quiero es crear una funcion Generica, que me debuelta el total de registros en un FILE
L>  

En general, esto se hace con la cantidad de bytes que contiene cada registro y con la función 'fseek()' junto con 'ftell()' para colocarnos al final del fichero. Posteriormente, se hace un cálculo y listo. Por ejemplo,

size_t cantidadRegistros( size_t nTam, FILE *fEntrada )
{
  fseek( 0L, SEEK_END, fEntrada );
  return ftell( fEntrada ) / nTam;
}

Sin embargo, veo que tu fichero contiene registros válidos e inválidos y por tanto el código que te he dado no te soluciona tu caso.

L> 1.-  le paso como parametro el tipo de estructura, y el Nombrearchivo
L> 2.- y quiero que me debuelva el total de registros en ese Nombrearchivo
L> pero no me funciona me podrias ayudar por faovr soy nuevo en esto de C++.
L>  

Veamos el código.

L>  
L> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////Declaracion //////////////////////////////////////
L> template <class T> int TotalRegistrosTabla( T TipoStructura, char* cNombreArchivoEstado, bool *HuboError);
L>  
L> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////Definicion////////////////////////////////////////////////////////////////////////////
L> template <class T>
L> int TotalRegistrosTabla( T rRegistro, char *cNombreArchivoEstado, bool *HuboError)
L> {
L>         FILE *aRegistro;
L>         TipoStructura rRegistro; // creo que esto ya no va por que lo estoy entrando como parametro el tipo de instancia creo 

Efectivamente, esto no es correcto. De hecho, el compilador debería marcarte un error porque 'TipoStructura' no existe. En tu caso, debería ser T.

L>         int TotalRegistros = false;

No tiene sentido mezclar valores booleanos con valores enteros cuando realmente queremos cantidades. Deberías inicializar esta varaible a 0 (cero); esto es,

int TotalRegistros = 0;

L>         aRegistro = fopen(cNombreArchivoEstado, "rb");
L>         if(aRegistro == NULL)
L>         {
L>                 *HuboError =  true;
L>         }
L>         else
L>         {
L>                 fread(&rRegistro, sizeof(rRegistro), 1, aRegistro);
L>                 while( (!feof(aRegistro)) ) 
L>                 {
L>                          if(rRegistro.eliminado == false) )
L>                          {
L>                                   TotalRegistros = true;

Como ye he mencionado anteriormente, esto no tiene sentido si lo que quieres hacer es contar los registros válidos. Deberías incrementar este valor. Esto es,

++TotalRegistros;

[CORTE]

L> rPersona TipoStructura; // puede ser rPersona , Cliente, rAlumno, etc.
L> int Total = TotalRegistrosTabla( TipoStructura,  cNombreArchivo, bool &HuboError);

Es casi correca la llamada. Elimina la parte de 'bool'. Debería ser:

int Total = TotalRegistrosTabla( TipoStructura, cNombreArchivo, &HuboError );


Espero haber aclarado las dudas.

Steven


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