SoloCodigo

Programación General => Pascal => Mensaje iniciado por: thot_ohm en Jueves 16 de Junio de 2005, 00:18

Título: Archivos
Publicado por: thot_ohm en Jueves 16 de Junio de 2005, 00:18
De nuevo yo trancado en éste bendito programa!!!

Ya tengo listas mis rutinas para leer y almacenar datos.

Ahora estoy intentando crear una rutina que me muestre los datos que están en el archivo por pantalla (tengo que hacer que salgan en orden alfabético y que cumplan ciertos parámetros, pero vayamos por partes). Hice esta rutina:

Código: Text
  1.  
  2. procedure mostrararchivo; {Muestra los datos almacenados en el archivo}
  3.   var
  4.     c,l: integer;
  5.  
  6.   begin
  7.   abrearchivo;
  8.   l:= 5;
  9.   with Datos do
  10.     begin
  11.     while not (Eof (Archivo)) do
  12.       begin
  13.       ClrScr;
  14.       read (Archivo,Datos);
  15.       c:= 5;
  16.       gotoxy(c,l);
  17.       write ('Nombre: ');
  18.       write (nombre);
  19.       c:= c + 20;
  20.       gotoxy(c,l);
  21.       write ('Edad: ');
  22.       write (edad);
  23.       c:= c + 8;
  24.       gotoxy(c,l);
  25.       write ('Grado: ');
  26.       write (grado);
  27.       c:= c + 10;
  28.       gotoxy(c,l);
  29.       write ('Promedio: ');
  30.       write (prom :0 :2);
  31.       c:= c + 15;
  32.       l:= l + 1;
  33.       end
  34.     end;
  35.   close (archivo);
  36.   readln;
  37.   end;
  38.  
  39.  

Datos es una variable donde guardo los datos almacenados en el archivo (adjunto el archivo .pas completo para quien le quiera echar un vistazo).

Ahora bien, ésta rutina, aparentemente no hace nada porque no me muestra nada en pantalla.

Las dudas:

Está bien estructurada la rutina?
Será que no estoy guardando adecuadamente en el archivo?

Agradecido de antemano por la ayuda.
Título: Re: Archivos
Publicado por: Enko en Jueves 16 de Junio de 2005, 02:22
Deberías tener algo como esto:
Código: Text
  1.  
  2. begin
  3.   Assign(Archivo, Ruta);
  4.   Reset(Archivo);
  5.   while not Eof(Archivo) do
  6.   begin
  7.     Read(Archivo, Datos);
  8.     with Datos do
  9.     begin
  10.       WriteLn('Nombre: ', Nombre);
  11.       WriteLn('Edad: ', Edad);
  12.     end
  13.   end;
  14.   ReadLn;
  15.   Close(Archivo);
  16. end.
  17.  
  18.  

Por sierto, hay algo mal con el cálculo del promedio. Le ingreso como 'unica nota 2 y muestra cualquier cosa.  Te recomiendo que tengas una rutina a parte para eso:
Código: Text
  1.  
  2. for i := 1  to N do
  3.    Sumatoria := Sumatoria + Notas[i];
  4. Promedio := Sumatoria / n;
  5.  
  6.  
Es decir, priemero lee las notas y alamacenalas al vector, recien cuando tengas todas  haz el calculo del promedio sabiendo la cantidad N de las notas.
Título: Re: Archivos
Publicado por: thot_ohm en Jueves 16 de Junio de 2005, 15:51
Vamos por partes (siguiendo tu rutina):

1.- Assign(Archivo,Ruta): Esto lo hago en el procedimiento abrearchivo. ¿Es correcto hacerlo así? Me explico, al hacerlo en una rutina aparte, ¿la orden assign es válida cuando regresa al procedimiento origen?

2.- Reset(Archivo): Igualmente, se realiza en el procedimiento abrearchivo. La pregunta sería la misma que en 1.

Lo demás de esa rutina esta perfectly clear. Thanx.

En cuanto a lo del problema con el promedio,pues me quedé asi:  :blink: . Yo lo he probado para adelante y para atrás y me ha funcionado. No sé si tenga que ver, pero estoy compilando con FreePascal.

Probé con el ejemplo que tu dices (el de introducirle un unico valor 2) y el resultado me da un 2.00 tan grande como la copa de un pino jejeje (es un decir).

En éste foro, uno si se siente que forma parte de algo. Gracias por eso y por la ayuda (aunque sean repetitivas las gracias, un servidor siempre estará agradecido).
Título: Re: Archivos
Publicado por: thot_ohm en Jueves 16 de Junio de 2005, 21:58
Modifiqué la rutina original por la sugerencia que me dabas, quedó ésto:

Código: Text
  1.  
  2. procedure mostrararchivo; {Muestra los datos almacenados en el archivo}
  3.   var
  4.     c,l: integer;
  5.  
  6.   begin
  7.   abrearchivo;
  8.   l:= 5;
  9.     while not (Eof (Archivo)) do
  10.       begin
  11.       ClrScr;
  12.       read (Archivo,Datos);
  13.       with datos do
  14.         begin
  15.         c:= 5;
  16.         gotoxy(c,l);
  17.         write ('Nombre: ', Nombre);
  18.         c:= c + 20;
  19.         gotoxy(c,l);
  20.         write ('Edad: ', Edad);
  21.         c:= c + 8;
  22.         gotoxy(c,l);
  23.         write ('Grado: ', Grado);
  24.         c:= c + 10;
  25.         gotoxy(c,l);
  26.         write ('Promedio: ', Prom:0:2);
  27.         l:= l + 1;
  28.         end
  29.       end;
  30.   readln;
  31.   close (archivo);
  32.   end;
  33.  
  34.  

El error persiste. Me explico. No muestra nada en pantalla. Qué estoy haciendo mal? Estoy más perdido que un pinguino en el desierto. Sugieranme una línea de acción please!!!
Título: Re: Archivos
Publicado por: Enko en Viernes 17 de Junio de 2005, 03:20
Creo que encontré el error. <_<  ;)
La rutina de Abrir Archivo parece que no se que cosa......
La cambié por
Código: Text
  1.  
  2. procedure AbreArchivo;
  3. var
  4.   CodError: integer;
  5. begin
  6.   Assign(Archivo,Ruta);
  7.   {&#036;I-}
  8.   Reset(Archivo);
  9.   CodError:= IOResult;
  10.   {&#036;I+}
  11.   if CodError &#60;&#62; 0 then ReWrite(Archivo);
  12.   {si hay algun error lo sobreescribe}
  13. end;
  14.  
  15.  
Y al parecer se arregló el problema.

Te adjunto al final el pas por si acaso porque le borre los GotosXY pensando que escribía fuera de la pantalla :o.

Citar
En éste foro, uno si se siente que forma parte de algo. Gracias por eso y por la ayuda (aunque sean repetitivas las gracias, un servidor siempre estará agradecido).
Cuando hab'ia descubierto este foro pensaba lo mismo, y lo sigo haciendo :)