Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Ayuda archivos binarios..
Autor Mensaje
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #1
Ayuda archivos binarios.. Dudas y recomendaciones Algoritmos y Estructuras de Datos
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
25-08-2011 22:37
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.162
Agradecimientos dados: 77
Agradecimientos: 194 en 69 posts
Registro en: Nov 2009
Mensaje: #2
RE: Ayuda archivos binarios..
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 ^^
(Este mensaje fue modificado por última vez en: 25-08-2011 23:05 por Anirus.)
25-08-2011 22:59
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #3
RE: Ayuda archivos binarios..
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
(Este mensaje fue modificado por última vez en: 25-08-2011 23:43 por Nikod11.)
25-08-2011 23:39
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.162
Agradecimientos dados: 77
Agradecimientos: 194 en 69 posts
Registro en: Nov 2009
Mensaje: #4
RE: Ayuda archivos binarios..
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.
25-08-2011 23:49
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #5
RE: Ayuda archivos binarios..
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.


(Este mensaje fue modificado por última vez en: 26-08-2011 00:02 por Nikod11.)
26-08-2011 00:01
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.162
Agradecimientos dados: 77
Agradecimientos: 194 en 69 posts
Registro en: Nov 2009
Mensaje: #6
RE: Ayuda archivos binarios..
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.


(Este mensaje fue modificado por última vez en: 26-08-2011 01:08 por Anirus.)
26-08-2011 01:06
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #7
RE: Ayuda archivos binarios..
Excelente Anirus, sin palabras... simplemente una genia =D
Gracias por la ayuda
26-08-2011 18:22
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #8
RE: Ayuda archivos binarios..
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 ._.
07-09-2011 16:22
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.162
Agradecimientos dados: 77
Agradecimientos: 194 en 69 posts
Registro en: Nov 2009
Mensaje: #9
RE: Ayuda archivos binarios..
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
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #10
RE: Ayuda archivos binarios..
(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..)
13-09-2011 19:18
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.162
Agradecimientos dados: 77
Agradecimientos: 194 en 69 posts
Registro en: Nov 2009
Mensaje: #11
RE: Ayuda archivos binarios..
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.
(Este mensaje fue modificado por última vez en: 14-09-2011 19:56 por Anirus.)
14-09-2011 19:55
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
...
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 789
Agradecimientos dados: 84
Agradecimientos: 396 en 56 posts
Registro en: Mar 2011
Facebook LinkedIn
Mensaje: #12
RE: Ayuda archivos binarios..
Buenisimo, muchas gracias por la ayuda =D
15-09-2011 12:56
Envíale un email Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.