Programación General > Pascal
elminacion de registros en archivo
(1/1)
twipsy:
tengo un problema con un programa que tengo que hacer. el programa trata sobre una agenda de amigos en el que los datos se guardan en un archivo y la parte que me da problemas consiste en lo siguiente
-compactar los datos de forma que eliminemos los marcados como borrados (o sea, que si teníamos 23 ocupados y 5 estaban marcados como borrados, al final he de tener 18 ocupados, 0 marcados como borrados y han de ocupar las 18 primeras posiciones en el vector).
como podreis observar en el codigo, todo el programa esta bien excepto el procedure en el que se eliminan esos datos borrados
--- Código: Pascal ---program registres; uses crt;{type vector = array [1..100] of integer;type matriz = array [1..10,1..5] of integer;type mezcla = array [1..10] of matriz;} type persona = record nombre : string[15]; ap1,ap2 : string[12]; varon : boolean; direccion : string[30]; any_nac : integer; mes_nac : byte; dia_nac : byte; borrado : boolean; end;type vecpersonas = array [1..100] of persona; type agenda = record num_ocupados : byte; num_borrados : byte; personas : vecpersonas; end;Type fichero = file of agenda; procedure pulsa_tecla; begin gotoxy(1,24); write('Pulsa una tecla para continuar...'); readkey; clrscr; end; procedure presenta; begin clrscr; gotoxy(5,10); write('Programa de mantenimiento de una agenda'); gotoxy(5,11); write('======================================='); pulsa_tecla; end; procedure ficha; begin clrscr; gotoxy(10,5); write('Persona num :'); gotoxy(10,7); write('Nombre :'); gotoxy(10,8); write('Apellido 1 :'); gotoxy(10,9); write('Apellido 2 :'); gotoxy(10,10); write('Varón (s/n)?:'); gotoxy(10,11); write('Dia nacim. :'); gotoxy(10,12); write('Mes nacim. :'); gotoxy(10,13); write('Any nacim. :'); end; procedure muestra(i:byte; p:persona); begin ficha; gotoxy(24,5); write(i); gotoxy(24,7); write(p.nombre); gotoxy(24,8); write(p.Ap1); gotoxy(24,9); write(p.Ap2); gotoxy(24,10); if p.varon then write('Sí') else write('No'); gotoxy(24,11); write(p.dia_nac); gotoxy(24,12); write(p.mes_nac); gotoxy(24,13); write(p.any_nac); pulsa_tecla; end; procedure lee(i:byte; var p:persona);var op : char; begin ficha; gotoxy(24,5); write(i); gotoxy(24,7); readln(p.nombre); gotoxy(24,8); readln(p.Ap1); gotoxy(24,9); readln(p.Ap2); gotoxy(24,10); repeat op := readkey until op in ['s','S','n','N']; write(op); if op in ['s','S'] then p.varon := true else p.varon := false; gotoxy(24,11); readln(p.dia_nac); gotoxy(24,12); readln(p.mes_nac); gotoxy(24,13); readln(p.any_nac); p.borrado := false; pulsa_tecla; end; procedure nuevo(var a:agenda); var p : persona; begin inc(a.num_ocupados); lee(a.num_ocupados,p); a.personas[a.num_ocupados] := p; end; procedure modifica(var a:agenda);var num : byte; p : persona; begin clrscr; gotoxy(10,5); write('Dime el número de persona que quieres modificar: '); readln(num); lee(num,p); a.personas[num] := p; end; procedure lista(var a:agenda);var i : byte; begin clrscr; if (a.num_ocupados - a.num_borrados) = 0 then begin gotoxy(10,5); write('La agenda está vacía'); end else for i := 1 to a.num_ocupados do if not (a.personas[i].borrado) then muestra(i,a.personas[i]); pulsa_tecla; end; procedure borra(var a:agenda);var num : byte; begin clrscr; gotoxy(10,5); write('Dime el número de persona que quieres borrar: '); readln(num); a.personas[num].borrado := true; inc(a.num_borrados); end; procedure recupera(var a:agenda);var num : byte; begin clrscr; gotoxy(10,5); write('Dime el número de registro que quieres recuperar: '); readln(num); a.personas[num].borrado := false; dec(a.num_borrados); end; procedure elimina(var a:agenda); {este es la parte que no me funciona} var num: byte; var i: byte; begin for num:= 1 to a.num_ocupados do begin if not a.personas[num].borrado then begin inc (i); a.personas[i] := a.personas[num]; end; end; a.num_ocupados := num;a.num_borrados := 0; end; procedure menu(var a:agenda);var op : char; begin repeat clrscr; gotoxy(10,5); write('M E N U'); gotoxy(10,6); write('======='); gotoxy(10,8); write('1 - Nuev@ amig@'); gotoxy(10,9); write('2 - Modifica amig@'); gotoxy(10,10); write('3 - Lista amig@s'); gotoxy(10,11); write('4 - Elimina amig@s'); gotoxy(10,12); write('5 - Recupera amig@s'); gotoxy(10,13); write('6 - Compacta amig@s'); gotoxy(10,14); write('7 - Salir del programa'); gotoxy(10,17); write('Pulsa el número de tu elección: '); repeat op := readkey until op IN ['1'..'7']; case op of '1' : nuevo(a); '2' : modifica(a); '3' : lista(a); '4' : borra(a); '5' : recupera(a); '6' : elimina(a); end; until op = '7'; end; procedure lee_del_fichero(var f:fichero; var a:agenda); begin assign(f,'agenda.dat'); {$I-} reset(f); {$I+} if IOresult > 0 then begin a.num_ocupados := 0; a.num_borrados := 0; end else read(f,a); end; procedure guarda_al_fichero(var f:fichero; a:agenda); begin rewrite(f); write(f,a); close(f); end; var a:agenda; f:fichero;begin presenta; lee_del_fichero(f,a); menu(a); guarda_al_fichero(f,a);end. como puedo solucionarlo?
gracias y disculpen las molestias, pero empiezo a creer que soy un negado en la programacion
epayan:
aqui un code con los que requieres de archivos y registros y su tratamiento: alta, modificaciones, bajas fisicas, consultas y listados.
--- Código: Pascal --- program ejemplo_archivos;uses crt,dos,sysutils;{en este ejemplo se refleja el uso de registros con archivoshaciendo el uso de insercion, modificacion , y borrado fisico de losregistros} type TipoRegistro = Record Numero : Longint; Nombre : String[40]; Direccion : String[40]; Telefono : String[10];End; TipoArchivo = File Of TipoRegistro; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure AperturaDeArchivo(var TArchivo:Tipoarchivo);var Error: Word; Tecla:Char;Begin Assign(TArchivo,'c:Archivo.dat'); {$I-} Reset(TArchivo); Error:=IOResult; {$I+} If Error <> 0 Then Begin textattr:=14+4*16; gotoxy(4,24);write('Creando Bases Temporal !! '); rewrite(TArchivo); End;End; {*------|------|------|------|------|------|------|------|------|------|----*} procedure AperturaDeArchivoTemporal(var TTmpAArchivo:TipoArchivo);var Error: word; Tecla:Char;Begin Assign(TTmpAArchivo,'c:Archivo.Tmp'); {$I-} Reset(TTmpAArchivo); Error:=IOResult; {$I+} If Error <> 0 Then Begin textattr:=14+4*16; gotoxy(4,24);write('Creando Bases Temporal !! '); rewrite(TTmpAArchivo); End;End; {*------|------|------|------|------|------|------|------|------|------|----*} function BuscaRegistro(Var AArchivo:tipoArchivo;Var TIRegistro:TipoRegistro;Numero:LongInt):longint;Var Encontrado:longint;Begin textattr:=14+4*16; gotoxy(4,24);write('Buscando Registro..'); Encontrado :=-1; {inicializamos Encontrado a -1, valor inexistente} Seek(AArchivo,0); {Posicionamos al inicio el puntero del archivo} While not EOF(AArchivo) do {iniciamos ciclode recorrido del archivo} Begin Read(AArchivo,TIRegistro); {Leemos el Registro segun posicion del puntero} IF TIRegistro.Numero = Numero then{Comparamos el n£mero de registo con el numero solicitado} Begin {si es igual el registro encontrado} Encontrado:=FilePos(AArchivo)-1; {se envia la posicion del registro hallado} Seek(AARchivo,FileSize(AArchivo)); {se envia el puntero al final del archivo para terminar ciclo} End; End; IF Encontrado <> -1 then {si Encontrado no es igual a -1 , mandamos el valor de la funcion} Begin BuscaRegistro:=Encontrado; End Else {si no fue encontrado regresamos -1 a la busqueda} Begin BuscaRegistro:=-1; End; textattr:=0+2*16; gotoxy(4,24);write(' ');End; {*------|------|------|------|------|------|------|------|------|------|----*}Procedure BorraRegistro(Var AArchivo:Tipoarchivo; TIRegistro:TipoRegistro;Numero:LongInt);var TmpArchivo:tipoArchivo; TmpRegistro:tipoRegistro; EncontradoB:longint;Begin {Buscamos si existe el Registro a borrar} EncontradoB:=BuscaRegistro(AArchivo,TIRegistro,Numero); IF EncontradoB <> -1 then {Si existe} Begin seek(AArchivo,0); {nos posicionamos al inicio del archivo} While not eof(AArchivo) do {hacemos un ciclo de vaciado de registros a un archivo temporal menos el eliminado} Begin Read(AArchivo,TIRegistro); {leemos el registro completo} IF TIRegistro.Numero <> Numero then {comparamos el campo Registro.numero con el solicitado } Begin AperturaDeArchivoTemporal(TmpArchivo); {creamos el temporal} seek (TmpArchivo,filesize(TmpArchivo)); {nos posicionamos al final del archivo temporal} write(TmpArchivo,TIRegistro); {escribimos el registro} Close(TmpArchivo);{cerramos el registro} End; End; Close(AArchivo); {cerramos la bd de trabajo} erase(AArchivo); {eliminamos la bd de trabajo} { se puede usar en caso de no contar con la utileria sysutils Assign(TmpArchivo,'c:Archivo.Tmp'); Rename(TmpArchivo,'c:Archivo.dat'), en el caso de RenameFile } If RenameFile ('c:Archivo.tmp','c:Archivo.dat') then begin Gotoxy(3,24);write('Registro Eliminado'); Delay(600); End; End {encontrado <> -1} Else Begin textattr:=14+4*16; gotoxy(27,12);write('No Hallado ......!! '); Delay(1000); Close(AArchivo); {cerramos la bd de trabajo} End;End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure InicializaRegistro(Var TiRegistro : TipoRegistro);Begin TiRegistro.Numero :=0; TiRegistro.Nombre :=''; TiRegistro.Direccion:=''; TiRegistro.Telefono :='';End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Alta(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);Var Encontrado:Longint; TmpNumero:Longint; Salir:char;Begin Repeat InicializaRegistro(TiRegistro); textattr:=7+0*16;{atributos de pantalla} Clrscr; Gotoxy(25,4);write('Alta de Registro'); Gotoxy(25,10);write('Proporcione Numero : '); readln(TmpNumero); AperturaDeArchivo(TIArchivo); {aperturamos el archivo} Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TmpNumero); {buscamos el registro} Close(Tiarchivo); {cerramos el archivo} If Encontrado = -1 Then {no existe} Begin textattr:=7+0*16;{atributos de pantalla} Tiregistro.Numero:=TmpNumero; Gotoxy(25,12);write('Proporcione Nombre : '); readln(TiRegistro.Nombre ); Gotoxy(25,14);write('Proporcione Direccion : '); readln(TiRegistro.Direccion ); Gotoxy(25,16);write('Proporcione Tel‚fono : '); readln(TiRegistro.Telefono); {posicionamos el puntero al final del archivo y guardamos} AperturaDeArchivo(TIArchivo); Seek (TIArchivo,filesize(TIArchivo));{posicionamos el puntero al final del archivo} Write(TiArchivo,TiRegistro);{guardamos el registro al final del archivo} Close(TiArchivo); delay(100); End else {si existe} begin Gotoxy(15,17);write('Registro Existente,Pulse Enter'); readkey; end; gotoxy(20,22);write('Desea Continuar Almacenando Registros [S/N]'); Salir:=Readkey; Until (Salir='n') or (Salir='N');End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Baja(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);Var Encontrado:Longint; TmpNumero:Longint; Salir:char;Begin Repeat InicializaRegistro(TiRegistro); textattr:=7+0*16;{atributos de pantalla} Clrscr; Gotoxy(25,4);write('Baja de Registro'); Gotoxy(25,10);write('Proporcione Numero : '); readln(TmpNumero); AperturaDeArchivo(TIArchivo); {aperturamos el archivo} Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TmpNumero); {buscamos el registro} Close(Tiarchivo); {cerramos el archivo} If Encontrado <> -1 Then {existe} Begin AperturaDeArchivo(TIArchivo); {aperturamos el archivo} BorraRegistro(Tiarchivo,TIRegistro,TmpNumero); {llamada al procedimiento de borrado fisico} End Else {si no esxiste el registro} Begin Gotoxy(15,17);write('Registro No Existe,Pulse Enter'); readkey; End; Gotoxy(20,22);Write('Desea Continuar Dando de Baja a Registros [S/N]'); Salir:=Readkey; Until (Salir='n') or (Salir='N'); End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Modificacion(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);Var Encontrado:Longint; Salir:char;Begin Repeat InicializaRegistro(TiRegistro); textattr:=7+0*16;{atributos de pantalla} Clrscr; Gotoxy(25,4);write('Modificacion de Registro'); Gotoxy(25,10);write('Proporcione Numero : '); readln(TiRegistro.Numero); AperturaDeArchivo(TIArchivo); {aperturamos el archivo} Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TiRegistro.Numero); {buscamos el registro} Close(Tiarchivo); {cerramos el archivo} If Encontrado <> -1 Then {existe} Begin textattr:=7+0*16;{atributos de pantalla} Gotoxy(25,12);write('Proporcione Nombre : '); readln(TiRegistro.Nombre ); Gotoxy(25,14);write('Proporcione Direccion : '); readln(TiRegistro.Direccion ); Gotoxy(25,16);write('Proporcione Tel‚fono : '); readln(TiRegistro.Telefono); AperturaDeArchivo(TIArchivo); {aperturamos el archivo} seek (TIArchivo,Encontrado);{posicionamos el p£ntero en la posici¢n donde se encontr¢ el registro en el archivo} write(TiArchivo,TiRegistro);{escribimos el registor modificado} close(TiArchivo); End Else Begin Gotoxy(15,17);write('Registro No Existe,Pulse Enter'); readkey; End; Gotoxy(20,22);Write('Desea Continuar Modificando Registros [S/N]'); Salir:=Readkey; Until (Salir='n') or (Salir='N');End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Consulta(TiRegistro:TipoRegistro;Var TiArchivo :TipoArchivo);Var Encontrado:Longint; Salir:char;Begin Repeat InicializaRegistro(TiRegistro); textattr:=7+0*16;{atributos de pantalla} Clrscr; Gotoxy(25,4);write('Consulta de Registro'); Gotoxy(25,10);write('Proporcione Numero : '); readln(TiRegistro.Numero); AperturaDeArchivo(TIArchivo); {aperturamos el archivo} Encontrado:= BuscaRegistro(TiArchivo,TIRegistro,TiRegistro.Numero); {buscamos el registro} Close(Tiarchivo); {cerramos el archivo} If Encontrado <> -1 Then {existe} Begin textattr:=7+0*16;{atributos de pantalla} Gotoxy(25,12);write('Nombre : ',TiRegistro.Nombre ); Gotoxy(25,14);write('Direccion : ',TiRegistro.Direccion ); Gotoxy(25,16);write('Tel‚fono : ',TiRegistro.Telefono); End Else {si no existe el registro} Begin Gotoxy(15,17);write('Registro No Existe,Pulse Enter'); readkey; End; Gotoxy(20,22);Write('Desea Continuar Consultando Registros [S/N]'); Salir:=Readkey; Until (Salir='n') or (Salir='N');End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Listado(TiRegistro:TipoRegistro;var TiArchivo:tipoArchivo);Var Contador:integer;Begin textattr:=7+0*16;{atributos de pantalla} Clrscr; Gotoxy(2,2);write('Numero Nombre Direccion'); Seek(TiArchivo,0); {Posicionamos al inicio el puntero del archivo} contador:=3; While not eof(TiArchivo) do Begin Read(TiArchivo,TIRegistro); {Leemos el Registro segun posicion del puntero} gotoxy(2,contador); Write(TIRegistro.Numero); gotoxy(17,contador); Write(TIRegistro.Nombre); gotoxy(47,contador); Write(TIRegistro.Direccion); inc(contador); End; readkey;End; {*------|------|------|------|------|------|------|------|------|------|----*} Procedure Menu(TiRegistro:TipoRegistro; Var TiArchivo:TipoArchivo);Var Tecla:Char; Begin ClrScr; Repeat textattr:=7+0*16;{atributos de pantalla} ClrScr; Gotoxy(25,6);Write('Alta de Registro ..............[1]'); Gotoxy(25,8);Write('Modificacion de Registro ......[2]'); Gotoxy(25,10);Write('Baja de Registro ..............[3]'); Gotoxy(25,12);Write('Consulta de Registro ..........[4]'); Gotoxy(25,14);Write('Listado de Registros...........[5]'); Gotoxy(25,16);Write('Salir .........................[6]'); Tecla:=Readkey; Case Tecla of '1':Begin Alta(Tiregistro,TiArchivo); End; '2':Begin Modificacion(TiRegistro,TiArchivo ); End; '3':Begin Baja(TiRegistro,TiArchivo ); End; '4':Begin Consulta(TiRegistro,TiArchivo ); End; '5':Begin AperturaDeArchivo(Tiarchivo); Listado(TiRegistro,TiArchivo); Close(TiArchivo); End; End; Until Tecla = '6';end; {*------|------|------|------|------|------|------|------|------|------|----*} { Cuerpo del programa }var TiArchivo : TipoArchivo; TiRegistro : TipoRegistro;Begin Menu(TiRegistro,TiArchivo);end.
Navegación
Ir a la versión completa