Programación General > Pascal
archivos se come el ultimo registro
tomas_sauron:
hola gente del foro necesito ayuda con este programa se trata de actuakizar un archivo de socios de un club con sus respectivos pagos,esta hecho el programa
el unico problema es en el procedure actualizar actualiza bien pero se come el ultimo registro si alguien sabe y m pued ayudar muchas gracias !!!!!
AQUI EL CODIGO
program ing_archivo;
uses crt;
type
tmes=1..12;
tdeuda=array[tmes]of real;
reg1=record
cod:integer;
nomape:string;
dir:string;
deuda:tdeuda
end;
reg2=record
cod:integer;
mes:tmes;
monto:real
end;
tsocio=file of reg1;
tpago=file of reg2;
var
socio:tsocio;rsoc:reg1;
pago:tpago;rpago:reg2;
socion:tsocio;tecla:string;
procedure ingrsoc(var socio:tsocio;var rsoc:reg1);
var
tecla:char;
i:tmes;
begin
assign(socio,'c:userstomassocio.dat');
rewrite(socio);
writeln('ingresa datos al archivo socios(s/n)' );
readln(tecla);
while(tecla='s')do
begin
writeln('ingrese cod soc');readln(rsoc.cod);
writeln('ingrese nom apell');readln(rsoc.nomape);
writeln('ingrese dir');readln(rsoc.dir);
for i :=1 to 12do
begin
writeln('ingrese deuda mes',i);
readln(rsoc.deuda)
end;
write(socio,rsoc);
writeln('ingresa mas datos (s/n)' );
readln(tecla)
end;
close(socio)
end;
procedure ingpago(var pago:tpago;var rpago:reg2);
var
tecla:char;
begin
assign(pago,'c:userstomaspago.dat');
rewrite(pago);
writeln('ingresa datos al archivo pagos(s/n)');
readln(tecla);
while(tecla='s')do
begin
writeln('ingrese cod soc');readln(rpago.cod);
writeln('ingrese mes abonado');readln(rpago.mes);
writeln('ingrese monto');readln(rpago.monto);
write(pago,rpago);
writeln('ingresa mas datos (s/n)');readln(tecla)
end;
close(pago)
end;
procedure actualizar(var socio:tsocio;var pago:tpago;var socion:tsocio);
var
rsoc,rnew:reg1;
rpago:reg2;cuenta:word;
begin
clrscr;cuenta:=0;
assign(socio,'c:userstomassocio.dat');assign(pago,'c:userstomaspago.dat');assign(socion,'c:userstomassocion.dat');
reset(socio);reset(pago);rewrite(socion);
read(socio,rsoc);read(pago,rpago);
while(not(eof(socio)))and(not(eof(pago)))do
begin
if rsoc.cod=rpago.cod then
begin
rnew:=rsoc;
rnew.deuda[rpago.mes]:=0;
write(socion,rnew);inc(cuenta);
read(socio,rsoc);
read(pago,rpago)
end
end;
writeln('se ingresaron',cuenta,'registros');
close(socio);
close(pago);
close(socion)
end;
function suma(vector:tdeuda):real;
var
i:tmes;
aux:real;
begin
aux:=0;
for i:=1to 12do
aux:=aux+vector;
suma:=aux
end;
procedure leer_socion(var socion:tsocio);
var
rsoc:reg1;i:tmes;cuenta:word;
begin
cuenta:=0;
writeln('codigo socio':10,' nombre apellido,':10,'direccion':10);
assign(socion,'c:userstomassocion.dat'); reset(socion);
while(not eof(socion))do
begin
read(socion,rsoc);
writeln( rsoc.cod:10,' ',rsoc.nomape:10,' ',rsoc.dir:10);
writeln('deuda');
for i:=1 to 12do
writeln('mes ',i,rsoc.deuda:10:2);
inc(cuenta)
end;
close(socion);write('leeyeron',cuenta);
writeln()
end;
procedure mostrar_deuda(var socion:tsocio);
var
rsoc:reg1;i:tmes;cuenta:word;
begin
writeln('socios que poseem deuda:');
assign(socion,'c:userstomassocion.dat'); reset(socion);
cuenta:=0;
while(not eof(socion))do
begin
read(socion,rsoc);
if suma(rsoc.deuda)<>0 then
writeln(rsoc.cod:10,rsoc.nomape:10,suma(rsoc.deuda):10:2);
inc(cuenta)
end;
close(socion);writeln('se leyeron',cuenta,'registros');
writeln()
end;
procedure opcion(var tecla:string);
begin
writeln('desea ingresar actualizar o leer');
writeln('si quiere ingresar presione ing,si quiere actualizar act o si quiere leer presione leer');
read(tecla);
if tecla='ing'then
begin
ingrsoc(socio,rsoc);
ingpago(pago,rpago)
end
else
if tecla='act'then
actualizar(socio,pago,socion)
else
if tecla='leer'then
begin
leer_socion(socion) ;
mostrar_deuda(socion)
end
end;
begin
clrscr;
opcion(tecla);
readkey
end.
Amilius:
No todas las implementaciones de eof() funcionan igual. Siendo que pascal fue bien pensado para manejar archivos tiene la mejor y más simple implementación: eof() retorna verdad si y sólo si estás en la posición final del archivo ¿O acaso tendría que ser de otra forma?. En otros lenguajes como C, C++ las librerías estándar implementan el eof de tal forma que es necesario ejecutar antes una operación de entrada/salida. En otras palabras implementan "Error, fin de archivo" en lugar de implementarlo correctamente como simplemente "Fin de archivo".
Por lo tanto en pascal primero tienes que preguntar si estás al final del archivo, si no es el caso entonces recién lees el registro.
tomas_sauron:
a ver si interprete bien dcis q debo crear un subprograma q asigne a una variable booleana si es fin de archivo ?????...ah otra cosa esta bie lee ants del bucle (ciclo)????
disculpa si mis preguuntas son medio pero ac poco empece a programar algo d un mes gracias x la respuesta!!!
PD:si leo luego de preg el fin de archivo(o sea dentro del while) se pierd el registro del medio
Amilius:
--- Cita de: "tomas_sauron" ---a ver si interprete bien dcis q debo crear un subprograma q asigne a una variable booleana si es fin de archivo ?????...ah otra cosa esta bie lee ants del bucle (ciclo)????
disculpa si mis preguuntas son medio pero ac poco empece a programar algo d un mes gracias x la respuesta!!!
PD:si leo luego de preg el fin de archivo(o sea dentro del while) se pierd el registro del medio
--- Fin de la cita ---
Lo que dije es que primero preguntes por el final de archivo y luego leas.
No tengo compilador de pascal a mano, pero esto debería funcionar:
--- Código: Pascal --- procedure actualizar(var socio:tsocio;var pago:tpago;var socion:tsocio);varrsoc,rnew:reg1;rpago:reg2;cuenta:word;beginclrscr;cuenta:=0;assign(socio,'c:userstomassocio.dat');assign(pago,'c:userstomaspago.dat');assign(socion,'c:userstomassocion.dat');reset(socio);reset(pago);rewrite(socion); while(not(eof(socio)))and(not(eof(pago)))dobegin read(socio,rsoc);read(pago,rpago);if rsoc.cod=rpago.cod thenbeginrnew:=rsoc;rnew.deuda[rpago.mes]:=0;write(socion,rnew);inc(cuenta); end end;writeln('se ingresaron',cuenta,'registros');close(socio);close(pago);close(socion) end;
tomas_sauron:
mmmmmmm gracias por tu ayuda pero por alguna razon yo lo habia probado asi pero se pierde el registro del medio.....igualmente lo pude resolver creando un procedimiento
q asigne a una variable el fin de archivo es algo asi
--- Código: Pascal ---procedure leersoc(var socio:tsocio;var rsoc:reg1;var finsoc:boolean); begin finsoc:=eof(socio); if not(finsoc)then read(socio,rsoc) else finsoc:=true;end;
PD:igual MUCHAS GRACIAS !!!!!saludos !!
Navegación
[#] Página Siguiente
Ir a la versión completa