Pascal/Turbo Pascal - Ordenar descendentemente los datos de un fichero

 
Vista:

Ordenar descendentemente los datos de un fichero

Publicado por Maria (3 intervenciones) el 09/06/2007 18:13:28
Hola!

A ver si me pueden ayudar con algo que me está sacando de mis casillas. Les cuento:

Estoy implementando un procedimiento que me lea un fichero de enteros, cuyos datos estan ordenados acscendentemente y lo que quiero es que me ordene esos datos descendentemente. Lo que he hecho es:
- copiar los datos del fichero en un fichero auxiliar temporal
- y lo que pensaba hacer ahora es colocarme al final del fichero temporal e ir leyendo sus datos mientras los copio en el fichero original.

Pero el caso es que no se como hacer para recorrer hacia detras el fichero temporal.

¿Alguien me puede ayudar?

Para recorrer hacia atras puse un while (not filepos(auxiliar) = 0) do... pero nada, no hay manera. Solo me falla la condicion, es que no se como hacer para recorrer hacia atras, el resto ya lo he hecho.

Muchas 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

Usa una pila

Publicado por Pascual (94 intervenciones) el 09/06/2007 18:57:57
Se me ocurre que puedes hacer esto:

1) Lees del fichero los registros y los vas volcando a una pila.

2) Borras el contenido del fichero.

3) Vas leyendo de la pila y lo vas metiendo al fichero.

De esta forma se quedará como quieres.

Ten en cuenta dos cosas fundamentales, para invertir piensa en pilas y recursividad, es siempre la forma ideal de hacerlo.

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:Usa una pila

Publicado por Maria (3 intervenciones) el 09/06/2007 21:04:47
Pufffª jejeje.

Es que todavia no he llegado a esos temas :?

Es que con ficheros no debe ser tan complicado, lo unico que no se es como recorrer desde el final al principio.

Gracias de todas formas.
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

¿Has dado arrays?

Publicado por Pascual (94 intervenciones) el 09/06/2007 23:08:50
¿Has dado arrays? Con estos se puede hacer lo que pides fácilmente también.

Vale, hagámoslo como tú dices.

Lo primero, una vez que tengas los datos almacenados en el archivo has de saber que para posicionar el puntero del archivo al final de este se hace de esta forma:

Seek (VariableArchivo, FileSize(VariableArchivo));

En este momento el puntero del archvivo está apuntado al último registro. Por si no lo sabías la función FileSize devuelve el tamaño del archivo que recibe como parámetro y el procedimiento Seek posiciona el puntero del archivo en el número de registro del archivo pasado como parámetro del archivo pasado como parámetro.

Como quieres recorrerlo hacia atrás, declárate una variable i de tipo entero (integer) por ejemplo y prueba con esto dentro del bucle:

Seek (auxiliar, FileSize(auxiliar) - i);

Deberás de ir incrementando en una unidad la variable i y si todo va bien el bucle terminará cuando Filepos(auxiliar) = 0 por tanto tu bucle while tendrá la condición que has puesto anterioremte:

while (not FilePos(auxiliar) = 0) do

Queda mejor poner FilePos que filepos pero eso ya es cuestión de gustos ya que Pascal no es key sensitive.

Saludos y ya me contarás.
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:¿Has dado arrays?

Publicado por Maria (3 intervenciones) el 10/06/2007 09:53:28
Pues ante todo, de nuevo, muchas gracias!

Gracias por refrescarme la mente al contarme al detalle para qué es cada funcion. Te lo agradezco. Pero el caso es que no me entra dentro del bucle "while (not FilePos(auxiliar) = 0) do". Lo unico que hago antes del bucle es colocarme al final del fichero auxiliar (seek(auxiliar, filesize(auxiliar))) y al principio del fichero original (seek(fich, 0)).

La verdad es que me está desesperando porque sé que es algo sencillo pero que parece que no controlo.
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

Pon un Writeln(FilePos(auxiliar)); antes del bucle

Publicado por Pascual (94 intervenciones) el 10/06/2007 12:46:41
Pon un Writeln(FilePos(auxiliar)); y un Writeln(FileSize(auxiliar)); antes del bucle, de esta forma vemos el número de registro al que apunta el apuntador del fichero, vemos el tamaño del fichero y por qué razón no entra en el bucle. Todo indica a que el fichero auxiliar está vacío y no entra en el bucle porque FilePos(auxiliar) = 0.

En realidad no deberías posicionarte al final del fichero auxiliar porque al copiar los datos del fichero al auxiliar ya se hace automáticamente. ¿No crees?

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:Usa una pila

Publicado por Diego Romero (996 intervenciones) el 11/06/2007 22:35:40
Para leer un archivo con tipo en orden inverso puedes hacer algo como...

pos:=FileSize(arch)-1;
repeat
dec(pos);
Seek(arch,pos);
Read(arch,buffer);
Write(arch2,buffer);
until pos=0;

Lo que hago acá es contar cuántos registros tiene el archivo, entro al ciclo repeat restando uno a pos (porque el último registro está en pos-1), muevo el puntero de lectura con Seek a esa posición, leo ese registro en buffer (que será de tipo integer en tu caso) y escribo buffer en otro archivo.
Este ciclo se termina cuando acabo de mover la positión 0 (que visto a la inversa es el último registro).
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