Pascal/Turbo Pascal - ayuda para ordenar archivos de acceso secuencial.

   
Vista:

ayuda para ordenar archivos de acceso secuencial.

Publicado por nicolas (1 intervención) el 21/02/2012 00:09:50
soy nuevo en esto de programacion, y necesitaria si alguien me puede explicar, o si no es mucha molestia darme un pequeño ejemplo, de como ordenar archivos binarios de acceso secuencial. Lo que habia pensado fue pasar el archivo a un vector, pero si el archivo es muy grande puede que no me entre en memoria. Lo que anduve leyendo en algunos libros y apuntes es que pasan el archivo por partes, pero no termino de entender el metodo.
espero que alguien me pueda ayudar.
desde ya 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

ayuda para ordenar archivos de acceso secuencial.

Publicado por ramon (2072 intervenciones) el 21/02/2012 20:15:39
{Espero esto te ayude fíjate entro los datos, los guardo, los presento sin ordenar, los ordeno
y los presento ordenados suerte}

program pruorena;
uses
crt;
const
archivo = 'prueva.ord';
noreg : array[1..8] of string[20] = (
'Anjelito','Francisco','Unverto','Venito','Luciano','Emilio',
'Paco','Galiano');


type
regprue = record
nume : integer;
nombre : string[20];
end;


var
f : file of regprue;
pru : array[1..2] of regprue;
nu : array[1..8] of integer;
k : integer;

procedure guarda(nomb : string);
begin
assign(f,nomb);
{$I-} reset(f); {$I+}
if ioresult <> 0 then
begin
rewrite(f);
seek(f,0);
write(f,pru[1]);
close(f);
end
else
begin
seek(f,filesize(f));
write(f,pru[1]);
close(f);
end;
end;

procedure entradas;
var
i, t, si, alt : integer;
begin
randomize;
i := 1;
repeat
alt := random(9);
si := 0;
t := 1;
repeat
if nu[t] = alt then
begin
si := 1;
end;
t := t + 1;
until (t > 8) or (si = 1);
if si = 0 then
begin
nu[i] := alt;
i := i + 1;
end;
until i > 8;
end;


procedure ordenardiccionario;
var
hl, il, len : longint;
tempo : regprue;
begin
assign(f,archivo);
{$I-} reset(f); {$I+}
if ioresult <> 0 then
begin
writeln('Archivo <', archivo, ' > no Encontrado');
halt(1);
end
else
begin
len := filesize(f) - 1;
for il := 0 to len do
begin
seek(f,il);
read(f,pru[1]);
for hl := len downto il do
begin
seek(f,hl);
read(f,pru[2]);
if pru[1].nume > pru[2].nume then
begin
tempo.nume := pru[1].nume;
tempo.nombre := pru[1].nombre;
pru[1].nume := pru[2].nume;
pru[1].nombre := pru[2].nombre;
pru[2].nume := tempo.nume;
pru[2].nombre := tempo.nombre;
seek(f,il);
write(f,pru[1]);
seek(f,hl);
write(f,pru[2]);
end;
end;
end;
close(f);
end;
end;

procedure muestra_archivo(x : integer; nomb : string);
var
co, tama : longint;
h : integer;
begin
assign(f,archivo);
{$I-} reset(f); {$I+}
if ioresult <> 0 then
begin
writeln('Archivo <', archivo, ' > no Encontrado');
halt(1);
end
else
begin
tama := filesize(f) - 1;
for co := 0 to tama do
begin
seek(f,co);
read(f,pru[1]);
gotoxy(x,2 + co);write('N§ = ',pru[1].nume,' Nombre = ',pru[1].nombre);
end;
close(f);
end;
end;


begin
clrscr;
entradas;
for k := 1 to 8 do
begin
pru[1].nume := nu[k];
pru[1].nombre := noreg[k];
guarda(archivo);
end;
clrscr;
gotoxy(2,1);write('Archivo sin Ordenar');
muestra_archivo(2, archivo);
ordenardiccionario;
gotoxy(40,1);write('Archivo Ordenar');
muestra_archivo(40, archivo);
readln;
erase(f);
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