Programación General > Pascal
Leer Y Modificar Archivo .dat
jeraco:
Buenas tardes, si alguien me puede ayudar a resolver este problema:
Tengo archivo llamado aclie.dat con la siguiente estructura:
--- Código: Text --- program cliente;usescrt, dos;Type RegSplCliente = Record Case Byte Of 0: ( Conf: RegConfArchivo); 1: ( Codigo: String[KL]; Descripcion, Representante, Direccion1, Direccion2: String[40]; Telefonos: String[30]; ZonaC, VendC: String[KM]; Clase: String[KO]; MesVenc: SmallInt; TipoPVP: Byte; CreditoStat: Byte; MaxCredito, {maximo credito permitido} PagosA, {pagos anticipados} SaldoP, {saldo pendiente} MontoMax, {Monto maximo venta} MontoMaxCre, {maximo credito} IVARetenido: Real; UltimaV, UltimoP: RegUltimaOperacion; ChequesD: Array[1..5] Of RegUltimaOperacion; PromDay: SmallInt; NDays: SmallInt; RIF: String[15]; TipoIva: Char; UVend: String[KM]; {Ultimovendedor} IntMora: Boolean; BitVarios: Byte;{$IFNDEF CHILE} {$IFNDEF COLOMBIA} NIT: String[15]; {$ELSE} Dummy0: Array[1..16] Of Byte; {$ENDIF}{$ELSE} Dummy0: Array[1..16] Of Byte;{$ENDIF} Estadistics: Array[1..NMes,1..EstC] Of Real; {Cambios del dia 12-9-98 OJO !!!} FlagContab: Boolean; CuentaContab: String[25]; Descuento: Real; Dummy2: Array[1..50] Of Byte; ); End; RegCliente = Record Status: LongInt; Special: RegSplCliente; DataArea: Array[1..1] Of Byte; End; Var F: File of Regcliente; P: Regcliente; Begin clrscr; Assign(F,'aclie.dat'); reset(F); while not Eof(F) do begin read(F,P); with P,special do begin maxcredito:=maxcredito/1000; saldop:=saldop/1000; montomax:=montomax/1000; montomaxcre:=montomaxcre/1000; end; seek(F,filepos(F)-1); write(F,P); end; close(F); end. El problema es que el compila Bien, pero cuando lo ejecuto da un error 100
si alguien tiene una solucion, para modificar y accesar este archivo seria de suma ayuda
gracias
Enko:
Me sorprende que el codigo compile. Al parecer está escrito usando las librerias de Turbo Pascal pero el codigo es de Free Pascal o Delphi.
No le detecto fallas exepto que el archivo no exista en la carpeta de la ejecutable.
--- Código: Text --- P,special Alli va un "." y no una coma. (medio dificil que compile)
jeraco:
amigo enko, ya todo eso de archivo en carpeta y compilacion ya fue descartado de hecho hice el mimo codigo para otro archivo que se llama aprod.dat (del sistema Saint) y funciono bien. Yo creo que el error esta en el Record anidado o en en la longitud del campo Dummi2 pero no encuentro la solucion. En cuanto a la parte del codigo p,special es por que lee con el with a p y tambien a special la sintaxis esta bien necesito otro tipo de ayuda que no se limite a buscar una simple coma porque ese no es el problema
Enko:
--- Citar ---Yo creo que el error esta en el Record anidado o en en la longitud del campo Dummi2 pero no encuentro la solucion
--- Fin de la cita ---
Supongo que tienes razón ahí.
Lo más probable es que esté mal la estructura de los registros. Pero con eso no hay que te ayude pues no se cual debería ser la estructura correcta.
Lo que puedes intentar es abrir el archivo *.dat en cuestion con un editor hexadecimal y comprobar vos mismo como es la estructura correcta. (supongo que te llevará bastante tiempo).
De donde conseguiste la info sobre la estructura del archivo? Si está en un manual comprueba que esté bien. Si la creaste vos, sería rarisimo.
--- Citar --- En cuanto a la parte del codigo p,special es por que lee con el with a p y tambien a specia
--- Fin de la cita ---
Si el problema es que "p" es de tipo "Regcliente" y "Special" es de tipo RegSplCliente
Como veras, son dos tipos de datos distintos.
Como si esto fuera poco:
--- Citar ---RegCliente = Record
Status: LongInt;
Special: RegSplCliente;
DataArea: Array[1..1] Of Byte;
End;
--- Fin de la cita ---
RegSplCliente forma parte de RegCliente. Por eso es que va un "." y no una coma.
--- Citar --- with P,special do
begin
maxcredito:=maxcredito/1000;
saldop:=saldop/1000;
montomax:=montomax/1000;
montomaxcre:=montomaxcre/1000;
end;
--- Fin de la cita ---
maxcredito, saldop, montomax, montomaxcre forman parte de "RegSplCliente" y no de RegCliente, por eso que va el punto ya que se quiere acceder a los campos de p.Special : RegSplCliente; pues estos campos no son parte de P sino de p.special
--- Citar ---RegCliente = Record
Status: LongInt;
Special: RegSplCliente;
DataArea: Array[1..1] Of Byte;
End;
--- Fin de la cita ---
--- Citar --- DataArea: Array[1..1] Of Byte;
--- Fin de la cita ---
1 byte solo, seguro?
jeraco:
Muchas gracias enko pero me guastaria saber como harias tu una rutina para leer ese archivo con esa informacion y modicar los campos. Cambie incluso el with dando la direccion completa del campo ejemplo: p.special.maxcredito:=p.special.maxcredito/1000; y todas maneras el archivo revienta y no hace el cambio (no se por que) tal vez haya otra forma de leer ese archivo pregunto?
Navegación
[#] Página Siguiente
Ir a la versión completa