Pascal/Turbo Pascal - Guardar contenido ordenado de un archivo en otro

 
Vista:

Guardar contenido ordenado de un archivo en otro

Publicado por Pascual (94 intervenciones) el 08/03/2005 15:14:46
¿Cómo pordría hacer para guardar el contenido de un archivo de tipo entero en otro archivo archivo?. Es decir tenemos un archivo binario que contiene:
Posición 1: 34.
Posición 2: 12.
Posición 3: 1.
Posición 4: 2.

Y luego tenemos que guardar esto ordenado en otro archivo:
Posición 1: 1.
Posición 2: 2.
Posición 3: 12.
Posición 4: 34.

¿Cómo podría hacer esto?. He pensado en usar un array pero tengo un problema, el array tiene que ir desde uno hasta el número de registros del fichero inicial, pero el número de registros del fichero inicial no es una constante. ¿Hay una forma fácil de hacerlo?. Gracias :).
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:Guardar contenido ordenado de un archivo en otr

Publicado por Hurricane (39 intervenciones) el 08/03/2005 15:29:35
Puedes realizar una copia del archivo original, en utilizarlo como si fuera un array (leyendo/escribiendo) y así ordenar la lista directamente; sería más lento, pero no dependerías del largo del archivo para crear o no un Array.

Saludos ;-)
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:Guardar contenido ordenado de un archivo en otr

Publicado por Pascual (94 intervenciones) el 08/03/2005 18:29:57
¿Podrías ponerme un ejemplillo?.
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:Guardar contenido ordenado de un archivo en otr

Publicado por Hurricane (39 intervenciones) el 08/03/2005 21:57:24
Primero, aclárame cómo almacenas los números: como texto
WriteLn(F, Numero);

o como binario
BlockWrite(F, Numero, SizeOf(Numero), Writed);

Saludos ;-)
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:Guardar contenido ordenado de un archivo en otr

Publicado por Pascual (94 intervenciones) el 08/03/2005 22:03:32
Los guardo como binario de la forma:
Write (fichero_de_enteros,parametro_numerico);

PD: Nunca había visto lo de BlockWrite(F, Numero, SizeOf(Numero), Writed);
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

Estoy muy cerca de la solución

Publicado por Pascual (94 intervenciones) el 08/03/2005 22:50:14
Creo que ya lo tengo pero me da error de lectura.

PROGRAM Ordenar;
USES Crt;
TYPE
tfich_entero=FILE OF integer;
VAR
archivo1, archivo2: tfich_entero;
i, dato1, dato2: integer;
BEGIN
ClrScr;
{Abrir_entero (archivo1,'inicial.dat');
Abrir_entero (archivo2,'final.dat');}
Assign (archivo1,'inicial.dat');
Reset (archivo1);
Assign (archivo2,'final.dat');
Rewrite (archivo2);
{REPEAT}
FOR i:=1 TO FileSize (archivo1) DO
BEGIN
seek(archivo1,i);
read(archivo1,dato1);
seek(archivo1,i+1);
read(archivo1,dato2);
IF dato1 > dato2 THEN
BEGIN
seek(archivo2,i);
write(archivo2,dato2);
seek(archivo2,i+1);
write(archivo2,dato1)
END;
END;
{UNTIL}
Cerrar_entero (archivo1);
Cerrar_entero (archivo2);
END.
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:Estoy muy cerca de la solución

Publicado por Hurricane (39 intervenciones) el 08/03/2005 23:03:40
Si no me equivoco, para SEEK el primer registro es 0 y no 1, por lo que debes restarle uno a cada referencia.

Prueba con éso y nos cuentas. Saludos ;-)
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:Estoy muy cerca de la solución

Publicado por Pascual (94 intervenciones) el 08/03/2005 23:29:19
Con lo que he hecho sólo me ordena registros que están consecutivos. Es decir si tengo un registro así:
600 ---> 200
200 ---> 600
300 ---> 300
400 ---> 400
500 ---> 500
100 ---> 100
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:Estoy muy cerca de la solución

Publicado por Pascual (94 intervenciones) el 09/03/2005 00:06:07
El tema es que tendría que seguir ordenando hasta que todo quedase ordenado, pero claro sólo lo hace una vez, y también he pensado en meter el for dentro de un repeat pero siempre va a ordenar lo mismo por mucho que repita, el tema es que valla combinado una posición con otra hasta hacer todas las combinaciones y no sólo las consecutivas pero me quedo en blanco.
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

¡Lo conseguí!

Publicado por Pascual (94 intervenciones) el 11/03/2005 18:49:13
PROCEDURE Ordenar_fichero (VAR arch1: tfich_entero; VAR nombre1: string);
VAR
i, x, n, iteracion, dat1, dat2: integer;
BEGIN
iteracion:=0;
REPEAT
BEGIN
Assign (arch1,nombre1);
Reset (arch1);
iteracion:=iteracion+1;
FOR i:=1 TO FileSize (arch1)-2 DO
BEGIN
n:=FileSize (arch1)-2;
Read (arch1,dat1,i);
x:=i+1;
Read (arch1,dat2,x);
IF dat1 > dat2 THEN
BEGIN
Write (arch1,dat2,i);
Write (arch1,dat1,i+1);
END;
END; {END del bucle FOR}
Close (arch1);
END; {END del REPEAT}
UNTIL iteracion=n;
END;
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