UTNianos

Versión completa: Ayuda archivos binarios..
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Espero no quedar muy noob con esta duda jajaja. Resulta que baje un aporte que subieron sobre archivos y lo entre a toquetear un poco, no creo que haya hecho cagada pero me parece que no me guarda bien los registros. Si me pueden dar una manito con esto me vendria joya, abrirlos pude =P


program crear;
uses crt;
type

trNotas=record
materia:string;
duracion:char;
tipo:char;
nota:byte;
end;
tfNotas = file of trNotas;

var arch:tfNotas;
rNotas:trNotas;
begin
assign(arch,'C:\notas.txt');
rewrite(arch);
clrscr;
writeln('Ingrese nombre de materia');readln(rNotas.materia);

while (rNotas.materia<>'') do begin
writeln('Ingrese duracion de materia de materia(c/a)');readln(rNotas.duracion);
writeln('Ingrese tipo de examen p/f'); readln(rNotas.tipo);
writeln('Ingrese su nota');readln(rNotas.nota);
write(arch,rNotas);
clrscr;
writeln('Ingrese nombre de materia');readln(rNotas.materia);
end;
close(arch);
end.




Saludos
Ahí lo revisé, lo probé con leer.pas y encontré que este era el problema:

Cita:trNotas=record
materia:string;
duracion:char;
tipo:char;
nota:byte;
end;

Si vos no aclarás el tamaño del string, por default es 255 caracteres, por lo tanto trNotas ocupa 256 + 1 +1 +1 = 259 bytes (por ahí le puse un byte de menos o uno demás al string, no me acuerdo bien como era el tema del tamaño en pascal), mientras que en el archivo leer.pas puse:
Cita:trNotas=record
materia:string[30];
duracion:char;
tipo:char;
nota:byte;
end;

Por lo que su tamaño es 31 + 1 +1 +1 = 34 bytes
Así que vos por registro estás escribiendo 259 bytes e intentando leer 34 bytes, por eso no lee lo mismo que escribís, ya que al leer mete los primeros 31 bytes en trNotas.materia y el resto (que también formarían parte del nombre de la materia, por ser 255 bytes) los guarda en los otros campos (duración, tipo, nota) creyendo que materia tiene sólo 30 caracteres, se soluciona poniendo en los dos programas que la estructura sea del mismo tamaño, que el string tenga 30 o 255 caracteres (o la cantidad que quieras) pero que en ambos sea el mismo =) , le puse el [30] a lo que posteaste y anduvo bien. Cualquier cosa volvé a preguntar ^^
Muchas gracias Anirus =). Obtuve como resultado:

algoritmos cp5

Ahora pruebo como levantar los registros y ir mostrandolos... no me cierra demasiado como "identificarlos" pero voy a probar =P cualquier cosa te consulto =)

Pd: cambie, en nota, el byte por char jajaj
Vos seguí probando, se aprende más haciendo que leyendo =)

El problema de poner nota como char es que no vas a poder poner ningún 10 porque al tener dos caracteres sería un string[2] y no un char, en cambio con el tipo byte eso no sucede por su rango.
Claro que bobo xD

Mira, intente 'asi nomás' leer el archivo y me tira un error cuando lo ejecuto en el read(notas,rnotas); Te dejo el codigito...


program leer;
uses crt;
type
trNotas=record
materia:string[30];
duracion:char;
tipo:char;
nota:string[2];
end;
tfNotas = file of trNotas;

var arch:tfNotas;
rNotas:trNotas;
notas:tfNotas;

begin
assign(arch,'C:\notas.txt');
reset(arch);

writeln('Mat Dur Tipo Nota');
while(not Eof(notas)) do begin
read(notas,rnotas);
writeln(rNotas.materia,' ',rNotas.duracion,' ',rNotas.tipo,' ',rNotas.nota);
end;

close(arch);
readln();
end.


El problema es que usaste dos nombres para el archivo, inicializaste arch y leiste notas. Cambiando eso anda =)



program leer;
uses crt;
type
trNotas=record
materia:string[30];
duracion:char;
tipo:char;
nota:byte;
end;
tfNotas = file of trNotas;

var notas:tfNotas;
rNotas:trNotas;


begin
assign(notas,'C:\notas.txt');
reset(notas);

writeln('Mat Dur Tipo Nota');
while(not Eof(notas)) do begin
read(notas,rNotas);
writeln(rNotas.materia,' ',rNotas.duracion,' ',rNotas.tipo,' ',rNotas.nota);
end;

close(notas);
readln();
end.


Excelente Anirus, sin palabras... simplemente una genia =D
Gracias por la ayuda
Revivo el post, saben de algun apunte que tenga los temas de bajas y modificaciones en archivos binarios? Y en lo posible algun programita
No tengo nada de ese tema y el parcial lo tengo en 2 semanas ._.
Para hacer una modificación se busca el registro a modificar, una vez leído lo modificás, retrocedés una posición (porque te pasaste después de leer) y grabás el registro modificado. Para retroceder se hace un seek a la posición actual -1.
Respecto a las bajas, se puede hacer de varias formas:
  • Marcar el registro como inválido. Contra: ocupás disco con registros que no sirven (hasta que los sobreescribas con nuevos)
  • Hallar el registro a eliminar y correr todos los registros para arriba (de forma que no quede un hueco) y luego llamar a la función truncate que acorta el tamaño del archivo.
  • Crear un nuevo archivo, e ir copiando ahí todos los registros a medida que los leés, excepto los que quieras eliminar. Luego se borra el archivo original y se renombra el archivo nuevo como el anterior. Contra: ocupás más espacio en disco por tener dos archivos(hasta que borrás el viejo).
(09-09-2011 00:28)Anirus escribió: [ -> ]Para hacer una modificación se busca el registro a modificar, una vez leído lo modificás, retrocedés una posición (porque te pasaste después de leer) y grabás el registro modificado. Para retroceder se hace un seek a la posición actual -1.
Respecto a las bajas, se puede hacer de varias formas:
  • Marcar el registro como inválido. Contra: ocupás disco con registros que no sirven (hasta que los sobreescribas con nuevos)
  • Hallar el registro a eliminar y correr todos los registros para arriba (de forma que no quede un hueco) y luego llamar a la función truncate que acorta el tamaño del archivo.
  • Crear un nuevo archivo, e ir copiando ahí todos los registros a medida que los leés, excepto los que quieras eliminar. Luego se borra el archivo original y se renombra el archivo nuevo como el anterior. Contra: ocupás más espacio en disco por tener dos archivos(hasta que borrás el viejo).

Buenisimo, sabes que la modificación se me ocurrio asi =D El foro estaba caido y me puse a pensar un poco jajaja
Y la baja la pense de la 3er forma...
Cual seria la forma mas optima de dar una baja? (Lo digo mas que nada para el final..)
El 1) sólo lo podés hacer si la estructura del archivo te lo permite (si en el enunciado te dice que hay un campo que con X valor significa inválido). El 3) tiene la desventaja de que si te limitan el tamaño en disco no lo podés hacer. En clase usamos la 2, pero nunca vi que tomaran eliminar un registro, más bien te piden apareos. Recomiendo comprar el compilado de finales, después de hacer varios vas a ver que se parecen más o menos, los primeros cuestan (tardaba 2 días en hacerlos xD), después de algunos empezás a pensar más rápido y llegás a hacerlos en 2hs.
Buenisimo, muchas gracias por la ayuda =D
URLs de referencia