listar fichero
Publicado por nachete (1 intervención) el 19/01/2007 13:18:58
Hola.Pensé que habia solucionado el problema pero creo que no.Tengo 2 ficheros y los quiero ordenar por una campo(por ejemplo el campo nombre) y los quiero ordenar alfabaticamente, y para ello los voy insertando en una lista.Pero el problema es que cuando me los lista una vez,cuando le doy nuevamente a listar me da un error de lectura.Pero yo creo que esta bien abiertos los ficheros y cerrados.¿Alguien que me diga el fallo donde puede estar?
Gracias
Procedure MostrarLista(P:PNodo);
BEGIN
WHILE P <> Nil DO
BEGIN
Writeln(P^.Registro.titulo);
Readln;
P:=P^.Sig;
END;
END;
Procedure ListarFichero(VAR Fich.......);
VAR
Nuevo,P,Anterior:PNodo;
fin:boolean;
Clave:integer;
BEGIN
Reset(Fich1);
Reset(Fich2)
Posicion1:=0;
WHILE NOT EOF (Fich1) DO
BEGIN
Seek(Fich,Posicion1);
Read(Fich,....);
New(Nuevo);
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;
Posicion1:=Posicion1+1;
END;
Posicion2:=0;
WHILE NOT EOF (Fich2) DO
BEGIN
Seek(Fich2,Posicion2);
Read(Fich2,....);
New(Nuevo);
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;
Posicion2:=Posicion2+1;
END;
MostrarLista(Primero);
Close(Fich1)
Close(Fich2)
END;
.................
MENU:
......
3: BEGIN
Primero:=Nil;
fin:=false;
ListarFichero(Fich1,Fich2);
END;
Gracias
Procedure MostrarLista(P:PNodo);
BEGIN
WHILE P <> Nil DO
BEGIN
Writeln(P^.Registro.titulo);
Readln;
P:=P^.Sig;
END;
END;
Procedure ListarFichero(VAR Fich.......);
VAR
Nuevo,P,Anterior:PNodo;
fin:boolean;
Clave:integer;
BEGIN
Reset(Fich1);
Reset(Fich2)
Posicion1:=0;
WHILE NOT EOF (Fich1) DO
BEGIN
Seek(Fich,Posicion1);
Read(Fich,....);
New(Nuevo);
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;
Posicion1:=Posicion1+1;
END;
Posicion2:=0;
WHILE NOT EOF (Fich2) DO
BEGIN
Seek(Fich2,Posicion2);
Read(Fich2,....);
New(Nuevo);
Nuevo^.Sig:=Nil;
Anterior:=Nil;
IF Primero = Nil THEN
BEGIN
Primero:=Nuevo;
END
ELSE
BEGIN
P:=Primero;
fin:=false;
WHILE (P <> Nil) AND (NOT fin) DO
BEGIN
IF P^.Clave < Nuevo^.Clave THEN
BEGIN
Anterior:=P;
P:=P^.Sig;
END
ELSE
BEGIN
IF (Anterior<>Nil) THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=P;
fin:=true;
END
ELSE
BEGIN
Nuevo^.Sig:=P;
Primero:=Nuevo;
fin:=true;
END;
END;
END;
IF NOT fin THEN
BEGIN
Anterior^.Sig:=Nuevo;
Nuevo^.Sig:=Nil;
END;
END;
END;
Posicion2:=Posicion2+1;
END;
MostrarLista(Primero);
Close(Fich1)
Close(Fich2)
END;
.................
MENU:
......
3: BEGIN
Primero:=Nil;
fin:=false;
ListarFichero(Fich1,Fich2);
END;
Valora esta pregunta


0