Advertisement
Guest User

Untitled

a guest
May 27th, 2015
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.44 KB | None | 0 0
  1. Const
  2.      TAM_BLOQUE = 64;
  3.      CAPAC_BLOQUE = TAM_BLOQUE-SizeOf(Word);
  4.      PORC_CARGA = 0.9; {Porcentaje de carga de los bloques (se deja espacio disponible por si se actualizan
  5.      registros aumentando su longitud, para no tener que cambiarlos de bloque)
  6.      MARCA_FIN = 'fin'; {para representar el fin del archivo}
  7. Type
  8.     tNombre = String[31]; {para manejar personas en memoria}
  9.     tBloque = Record
  10.             cantRegs: Word; {cantidad actual de registros en el bloque}
  11.             contenido: Array[1..CAPAC_BLOQUE] of Byte;
  12.     end;
  13.     tPersonas = Record
  14.               arch: File of tBloque; {archivo de personas}
  15.               archLibres: File of Word; {archivo de control de bytes libres por bloque del archivo de personas}
  16.               bloque: tBloque; {ultimo bloque leido de personas}
  17.               iBloque: Word; {indice del primer byte libre}
  18.               archLibresBloque: Word
  19.     end;
  20.  
  21. {Agrega una persona en el primer bloque que tenga
  22. espacio o, si no hay ninguno,en un bloque nuevo al final del archivo}
  23. Procedure Agregar(var pp: tPersonas; nombre: tNombre);
  24. var
  25. tamReg: Byte;
  26. libres: Word;
  27. disponibles: integer;
  28. Begin
  29.      With pp do begin
  30.      Seek(pp.archLibres, 0);
  31.      // tamaño del registro a agregar.
  32.      tamReg:=Length(nombre)+1;
  33.      // se busca el primer registro con suficiente espacio
  34.      Repeat
  35.            Read(pp.archLibres, libres);
  36.            disponibles:=libres-Round((1-PORC_CARGA)*CAPAC_BLOQUE) {bytes libres menos los que no se pueden usar para altas}
  37.      until eof(archLibres) or (disponibles>=tamReg);
  38.  
  39.      If tamReg>disponibles then
  40.      begin {hay que agregar un nuevo bloque al final del archivo}
  41.           bloque.cantRegs:=0; libres:=CAPAC_BLOQUE;
  42.           iBloque:=1;  // somos idiotas y usamos one-based indexes
  43.           Seek(arch, FileSize(arch))
  44.      end
  45.      else begin
  46.           // se mueve a donde hay lugar en el archivo
  47.           Seek(pp.arch, FilePos(pp.archLibres)-1);
  48.           Read(pp.arch, pp.bloque);
  49.           // indice del primer byte libre
  50.           pp.iBloque:=CAPAC_BLOQUE-libres+1;
  51.           // se mueve al lugar correspondiente de escritura en ambos archivos
  52.           Seek(pp.arch, FilePos(pp.archLibres)-1);
  53.           Seek(pp.archLibres, FilePos(archLibres)-1)
  54.      end;
  55.      Move(nombre, bloque.contenido[iBloque], tamReg);
  56.      Inc(bloque.cantRegs);
  57.      Dec(libres,tamReg);
  58.      Write(arch, bloque);
  59.      Write(archLibres, libres);
  60.      end;
  61. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement