Pascal/Turbo Pascal - listar fichero

 
Vista:

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;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:listar fichero

Publicado por micropais (209 intervenciones) el 19/01/2007 21:45:56
Saludos nachete.

Veo que a tu code le faltan datos , entre ellos los nombres de fichero que
quieres abrir , o simplemente la sentencia assign y algunas cosillas más
empezamos con errores en la primera linea faltan datos por definir o se ha
perdido parte del codigo en la transmision.

que es eso de MENU:
y los puntos suspensivos ...... .......

estas bajo TP o bajo free ?? ¿usas etiquetas o es code esquematico?
ó es que tu 'K'ompilas mentalmente ó hay algo que realmente se me escapa.
te recuardo que algunos saben mas que otros pero seguro que no somos adivinos.
______________________________________________________________

Postea el code exacto y quizas alguien pueda ayudarte.
si no caben los ficheros de datos manda su nombre y estructura interna
y alo mejor se pueden simular.
(esto si que va a ser un gran reto para algunos).
______________________________________________________________

Abre tu fichero.pas con el block de notas de windows o el notepad , si usas linux
usa cualquier editor de textos.

Selecciona todo el texto y marca copiar, abre internet, entra en el foro , postea un mansaje nuevo y pega el texto diractamante al mensaje, luego retocalo con tus preguntas y dudas etc. si lo haces así .

¡¡¡ quizás !!! "alguien" , pueda ayudarte.

en mis tiempos un mensaje que empezase asi :
_________________________________________________

sejuro ke no tenguo herrores de orto grafia lla lo e conprovado.
_________________________________________________
iva directamente a la papelera.

algo parecido te digo sobre tu code...

- Pongamonos serios, que no a todo el mundo le sobra el tiempo para
perderlo de esta manera.

SALUDOS y hasta la proxima.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:listar fichero

Publicado por micropais (209 intervenciones) el 19/01/2007 22:22:17
Saludos otra vez Nachete.
Si todavia no has solucionado el problema ,espero tu code para echarle un vistazo.
_______________________________________________________________

No se si te puedo ayudar con este programa , no habla de ficheros si no de punteros , si no te vale , le prodrá valer a otra persona pues está bien documentado al final. _______________________________________________________________

Te envio un code para TP7 muestra como desplazarse por una lista de punteros de atras hacia adelante y adelante hacia atras esta tambien comentado al final.
_______________________________________________________________

{PRUEBA DE UNA LISTA DE PUNTEROS Y MOVIMIENTO DENTRO DE LA EXTRUCTURA }
{SE UTILIZAN 3 PUNTEROS MAS DOS UNO QUE MARCA EL FINAL Y OTRO QUE MARCA EL }
{PRINCIPIO PUDIENDOSE MOVER AMBAS DIRECCIONES }
program puntero00;

uses crt;
type
hoja=^Tcuaderno;
Tcuaderno=record
dato:string;
I :hoja;
d :hoja;
end;
var UE,PE,p1,p2,p3,PM:hoja;
datos:string;
msg:array[1..1] of string;
procedure sonido;
begin
sound(300);
delay(100);
nosound;
end;

begin
textcolor(7);
clrscr;

msg[1]:='Introduca(datos+intro) otra vez intro para terminar ';
{todos los punteros al elemento vacio al principio}
PM :=NIL; { puntero movil }
UE :=NIL; { ultimo elemento }
PE :=NIL; { primer elemento }

P1 :=NIL;
P2 :=NIL;
P3 :=NIL;
NEW(P3);
P3^.D:=NIL;
P3^.I:=NIL;
PE:=P3;
gotoxy(1,1);
writeln(msg[1]);
readln(datos); { obtenemos los datos del teclado }
gotoxy(1,2);
delline;

SONIDO;
P3^.I:=P1;
P3^.DATO:=DATOS;
P2:=P3;
NEW(P3);
P2^.D:=P3;
P1:=P2;
UE:=P1;

REPEAT
{ obtenci¢n de datos }
{****************}
gotoxy(1,1);
writeln(msg[1]);
readln(datos); { obtenemos los datos del teclado }
gotoxy(1,2);
delline;
{****************}
IF DATOS>PE^.DATO THEN
BEGIN
P3^.I:=P1;
P3^.DATO:=DATOS;
P2:=P3;
NEW(P3);
P2^.D:=P3;
P1:=P2;
UE:=P1;
END;

UNTIL DATOS=''; { repetir hasta que introducamaos una cadena vacia }
P3^.D:=NIL;

write('UE ');
P3:=UE; { nos situamos en el ultimo elemento y ... }
WHILE (P3<>NIL) DO
BEGIN
WRITE('þ-',P3^.dato); { imprimimos el dato que contiene linea }
P3:=P3^.i; { y nos movemos hacia la izquierda hasta que sea NIL}
END;

writeln;

{de primer a ultimo elemento}
write('PE ');
p3:=PE; { nos posicionamos en el primer elemento }

WHILE (P3^.d<>NIL) DO
BEGIN
write('þ-',p3^.dato); { imprimimos el dato que contiene linea }
p3:=p3^.d; { y nos movemos hacia la derecha hasta que sea NIL }
END;

RELEASE(P1);
RELEASE(P2);
RELEASE(P3);
RELEASE(UE);
RELEASE(PE);
RELEASE(PM);

READLN;

end.
{ _____________________________________________________________ }

{P3^.I:=P1; { la patilla p3^.i apunta a p1 }
{ osea NIL al principio }
{ o al elmento anterior (el de su izquierda ) }

{ P3^.LINEA:=DATOS;{ rellenamos la patilla datos de este p3 }
{ P2:=P3; { p2 se posiciona en p3 (antiguo) }
{ NEW(P3); { * creamos una nueva variable (p3 nuevo) }
{ P2^.D:=P3; { la patilla p2^.d osea el antiguo p3 apunta al }
{ sigiente elemto (por la derecha) osea p3 nuevo}
{ ULTIMO_E:=P1; { el puntero ultimo elementos se posiciona en el}
{ anterior al ultimo elemento (estetica) }
{ P1:=P2; { ahora p1 posiciona sobre p2 }
{ que es el ultimo elemento }
{ p1 guarda a p2 para que p2 guarde a p3 y p3 }
{ cree otra variable }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar