• Jueves 28 de Marzo de 2024, 23:19

Autor Tema:  archivos se come el ultimo registro  (Leído 2845 veces)

tomas_sauron

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
archivos se come el ultimo registro
« en: Jueves 3 de Febrero de 2011, 18:40 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: archivos se come el ultimo registro
« Respuesta #1 en: Jueves 3 de Febrero de 2011, 22:24 »
0
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

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: archivos se come el ultimo registro
« Respuesta #2 en: Jueves 3 de Febrero de 2011, 22:32 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: archivos se come el ultimo registro
« Respuesta #3 en: Jueves 3 de Febrero de 2011, 23:53 »
0
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

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
  1.  
  2. procedure actualizar(var socio:tsocio;var pago:tpago;var socion:tsocio);
  3. var
  4. rsoc,rnew:reg1;
  5. rpago:reg2;cuenta:word;
  6. begin
  7. clrscr;cuenta:=0;
  8. assign(socio,'c:userstomassocio.dat');assign(pago,'c:userstomaspago.dat');assign(socion,'c:userstomassocion.dat');
  9. reset(socio);reset(pago);rewrite(socion);
  10.  
  11. while(not(eof(socio)))and(not(eof(pago)))do
  12. begin
  13.  
  14. read(socio,rsoc);read(pago,rpago);
  15. if rsoc.cod=rpago.cod then
  16. begin
  17. rnew:=rsoc;
  18. rnew.deuda[rpago.mes]:=0;
  19. write(socion,rnew);inc(cuenta);
  20.  
  21. end
  22.  
  23. end;
  24. writeln('se ingresaron',cuenta,'registros');
  25. close(socio);
  26. close(pago);
  27. close(socion)
  28.  
  29. end;
  30.  
  31.  

tomas_sauron

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: archivos se come el ultimo registro
« Respuesta #4 en: Viernes 4 de Febrero de 2011, 14:13 »
0
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
  1. procedure leersoc(var socio:tsocio;var rsoc:reg1;var finsoc:boolean);
  2.  
  3. begin
  4.      finsoc:=eof(socio);
  5.      if not(finsoc)then
  6.        read(socio,rsoc)
  7.      else
  8.         finsoc:=true;
  9. end;
  10.  
  11.  

PD:igual MUCHAS GRACIAS !!!!!saludos !!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: archivos se come el ultimo registro
« Respuesta #5 en: Sábado 5 de Febrero de 2011, 18:01 »
0
Código: Pascal
  1. procedure leersoc(var socio:tsocio;var rsoc:reg1;var finsoc:boolean);
  2.  
  3. begin
  4.      finsoc:=eof(socio);
  5.      if not(finsoc)then
  6.        read(socio,rsoc)
  7.      else
  8.         finsoc:=true;
  9. end;
  10.  
:brickwall:

tomas_sauron

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: archivos se come el ultimo registro
« Respuesta #6 en: Sábado 5 de Febrero de 2011, 18:15 »
0
?????????????