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

Marcos Collado Martín marquitos.mcm en gmail.com
Mar Abr 24 21:14:39 CEST 2012


Hola, bueno estuve leyendo el cursillo de los ficheros ya que no tenía
mucha idea de estos y ví un algoritmo al que no le veia mucho sentido, o es
que lo veo mal ( que seguramente que sea eso): esta en este tema:
http://c.conclase.net/ficheros/index.php?cap=007#inicio en el ejemplo que
viene abajo del todo.
En esta función:

// Lee el registro desde el fichero de datos con el teléfono dadovoid
Leer(FILE <http://c.conclase.net/librerias/?ansitip=FILE> *fa,
stRegistro &reg, char *telefono)
{
   FILE <http://c.conclase.net/librerias/?ansitip=FILE> *fi;
   stIndice ind;
   long inf, sup, n, nRegs;

   fi = fopen <http://c.conclase.net/librerias/?ansifun=fopen>("indices.ind",
"rb");
   fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fi, 0,
SEEK_END <http://c.conclase.net/librerias/?ansimac=SEEK_END>);
   nRegs = ftell
<http://c.conclase.net/librerias/?ansifun=ftell>(fi)/sizeof(stIndice);
   // Búsqueda binaria:
   inf = 0;
   sup = nRegs-1;
   do {
      n = inf+(sup-inf)/2;
      fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fi,
n*sizeof(stIndice), SEEK_SET
<http://c.conclase.net/librerias/?ansimac=SEEK_SET>);
      fread <http://c.conclase.net/librerias/?ansifun=fread>(&ind,
sizeof(stIndice), 1, fi);
      if(strcmp
<http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono,
telefono) < 0) inf = n+1;
      else sup = n-1;
   } while(inf <= sup && strcmp
<http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono,
telefono));
   // Si se encontró el teléfono, lee el registro, si no muestra mensaje.
   if(!strcmp <http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono,
telefono)) {
      fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fa,
ind.indice*sizeof(stRegistro), SEEK_SET
<http://c.conclase.net/librerias/?ansimac=SEEK_SET>);
      fread <http://c.conclase.net/librerias/?ansifun=fread>(&reg,
sizeof(stRegistro), 1, fa);
   }
   else {
      reg.valido = 'N';
      printf <http://c.conclase.net/librerias/?ansifun=printf>("Registro
no encontrado\n");
   }
   fclose <http://c.conclase.net/librerias/?ansifun=fclose>(fi);
}


En la búsqueda binaria, a ver me explico:
Pongo el ejemplo de que tenemos en la variable sup = 10, entonces resuelvo
la ecuación para averiguar n -> n = 0 + (10 - 0) /2 = 5, bien ahora tengo n
= 5, pero resulta que en ese registro no está lo que busco y ese teléfono
es menor que el teléfono que yo he puesto, entonces a inf le daríamos el
valor de n + 1 ( en nuestro caso 6) y vuelvo a pasar por la ecuación y lo
que pasa es que si la hago: n = 6 + ( 10 - 6) / 2 = 5, es otra vez 5 porque
sí sumo y resto el mismo número al final queda el mismo número, no se si me
explico.
Ahora si el telefono de ese registro es mayor que el que he puesto yo sería
sup = n -1, hay si cambía ya el resultado de la ecuación.

Espero que alguien sepa si es así porque es así ( y me lo explique si es
posible) o si esta mal como pienso yo.

Un saludo y gracias :)
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120424/a9956bdf/attachment.html>


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