Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 22
esquerda21 Va por buen camino
Como gravar un array en disco

Hola .Me interesa poder gravar un array dinamico en el disco utilizando lago así como ASSIGNFILE. He estado mirando el help pero no me sale .Me dais un ejemplo de gravacion y otra de lectura con un array llamado PEPE?.
Gracias de antemano
Responder Con Cita
  #2  
Antiguo 09-06-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
si el array es de un tipo definido por ti, tienes que declarar la variable de ese tipo, es decir

Código:
type pepe = Record of
      nombre : string;
      telf : string
end;

var F : file of pepe;
    a : array of pepe;
    i : integer;
begin
   AssignFile(F, nombrearchivo);
   Rewrite(F):
   for i := 0 to Hi(a) do
      Writeln(F, a[i]);
   CloseFile(F);
end;
(no esta probado, lo he hecho de cabeza)

Si no es de un tipo propio, es mas sencillo todabia

Código:
var F : TextFile;
    a : array of string;
begin
   AssignFile(F, nombrearchivo);
   Rewrite(F):
   for i := 0 to Hi(a) do
      Writeln(F, a[i]);
   CloseFile(F);
end;
como ves, la forma de grabar es identica en un caso y en el otro

espero te sirva
Responder Con Cita
  #3  
Antiguo 09-06-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Holas, aprovecho este hilo para hacer una preguntilla, ya que me dió quebraderos de cabeza el otro dia.

Justo despues de abrir un archivo para leer, tuve que poner:

Reset(F);

porque si no, no me leia nada. ¿Son insconsistencias mias o hay que hacerlo?


Y otro detalle.... Jamás me atreveria a poner en duda las palabras del Sr cadetill, (por eso he mirado antes la ayuda de delphi ) WriteLn dice que es para archivos de texto, por tanto, para guardar una variable del tipo pepe bastaría con hacer:

Write (F,a[i]);


Un saludo
Responder Con Cita
  #4  
Antiguo 09-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola:

Lo del Reset(F) sí que hay que ponerlo para leer información del archivo.

Lepe ecribió:
Cita:
Jamás me atreveria a poner en duda las palabras del Sr cadetill, ...
Yo tampoco me atrevería pero donde pone Hi, en la sentencia de los bucles for, debe poner High.
__________________
Guía de Estilo
Responder Con Cita
  #5  
Antiguo 09-06-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Gracias andres
Responder Con Cita
  #6  
Antiguo 10-06-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Posteado originalmente por andres1569
Lepe ecribió:
Cita:
Jamás me atreveria a poner en duda las palabras del Sr cadetill, ...
Yo tampoco me atrevería pero donde pone Hi, en la sentencia de los bucles for, debe poner High.
joooo, ya dije que lo hacia de cabeza, que no tenia el Delphi delante pa probarlo

Con respecto a Reset, este te abre un fichero para lectura.
Tambien tienes Append, que te abre un fichero para escritura (al final del mismo) y Rewrite que te crea un nuevo fichero si no existe o, si existe, te lo "machaca"
Responder Con Cita
  #7  
Antiguo 11-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 22
esquerda21 Va por buen camino
Estado lellendo mi mensaje y al señor este...Como se llama? Es que no lo estoy viendo..

la diferencia de Write a Writeln esque este ultino cambia de linea, si no lo veiamos todo junto.

A y un consejo, dejar el FOR y utilizar el WHILE porque este ultimo lo ejecuta en un ciclo del relog y el FOR no es de Pascal sino de Visual Basic
Responder Con Cita
  #8  
Antiguo 11-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Esquerda21 escribió:
Cita:
Estado lellendo mi mensaje y al señor este...Como se llama? Es que no lo estoy viendo..
El señor éste se llama Lepe (al menos ése es su nick en estos foros), yo tampoco lo sabía hasta que me peocupé en mirarlo (a la izquierda de su mensaje lo pone). ¿"Lellendo"? ¿Dónde has "lellido" tú eso?

Cita:
la diferencia de Write a Writeln esque este ultino cambia de linea, si no lo veiamos todo junto.
¡CORRECTO! Pero la aclaración qué él hace va dirigida a una pregunta hecha por Esquerda21 (como ves sí que sé como se llama este señor/señora) donde pregunta cómo grabar un array, no un texto (grabar, no "gravar", que esto no va con Hacienda). ¡Buena aclaración, Lepe!

Cita:
A y un consejo, dejar el FOR y utilizar el WHILE porque este ultimo lo ejecuta en un ciclo del relog y el FOR no es de Pascal sino de Visual Basic
Antes de dar consejos léete la Guía de Estilo, y dedícate a cerrar los hilos que vas abriendo para aclarar si te solucionaron o no tu problema. En el foro de Gráficos te respondí hace 2 semanas y aún no sé si funcionó (no es por mí sino por el resto de foreros, así cuando se lee un hilo se sabe si la respuesta es válida). Por no hablar de varias preguntas más en los foros históricos (te has ganado a pulso que te lo recuerde).

En este hilo, al menos has dado las gracias por anticipado pero no te has molestado en decir si la solución de Cadetill te ha servido o no, eso sí, has respondido para dar consejos y poner a cada uno en su sitio.

El bucle FOR sí existe en Pascal, desde antes que naciera Visual Basic. Lo del ciclo de reloj (no de "relog"), ¿es muy importante en este caso? Si High(a) es -1 (array vacío) no se ejecuta ningún ciclo del bucle, y es más corto de programar que el WHILE. ¿Todos los bucles WHILE se ejecutan en un ciclo de RELOJ? ¿Aunque realicen 10.000 iteraciones? ¿El incrementar "a mano" un contador consume algún ciclo de reloj?

Por tu respuesta, sobre todo por la aclaración que haces del WriteLn, entiendo que ni siquiera has probado el código que te han ofrecido y corregido. Me gustaría saber cómo has grabado el array utilizando WriteLn, salvo que sea un array de strings, en ese caso hablaríamos de un fichero de texto (pero eso no se especifica en le pregunta inicial).
__________________
Guía de Estilo
Responder Con Cita
  #9  
Antiguo 12-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 22
esquerda21 Va por buen camino
Enefecto señorito andres1569, claro que lo he probado, Como todo lo que pregunto, pero disculpe mi ignorancia dado que no sabia que se debia contestar si me habia ido bien, igualmente este es el codigo q hice:

var
Form1: TForm1;

implementation

type
matriz = record
x1: integer;
y1: integer;
end;

var
matriz1: array of matriz;
//f: file of matriz;
i: integer;
F: TextFile;
const
max = 10;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);//Genera el array
var
i: integer;
begin
i:= 1;
repeat
SetLength(matriz1,i);
matriz1[i-1].x1:= i - 1;
matriz1[i-1].y1:= i + 1;
i:= i + 1;
until i = max;
end;

procedure TForm1.Button2Click(Sender: TObject);//Crea el archivo TXT
var
i: integer;
begin
i:= 1;
AssignFile(F, 'd:\delphi5\basura\pro.txt');
Rewrite(F);
repeat
Writeln(F, inttostr(matriz1[i].x1) + ' ' + inttostr(matriz1[i].Y1));
i:= i + 1;
until i = max;
CloseFile(F);
end;

procedure TForm1.Button3Click(Sender: TObject);//Pone en el MEMO1 el array
var
i: integer;
begin
memo1.Clear;
i:= 1;
repeat
memo1.Lines.Add(inttostr(matriz1[i].x1) + ' ' + inttostr(matriz1[i].Y1));
i:= i + 1;
until i = max;
end;

procedure TForm1.Button4Click(Sender: TObject);//Lee el fichero y lo carga en el MEMO2
var
i: integer;
S: STRING;
begin
i:= 1;
AssignFile(F, 'd:\delphi5\basura\pro.txt');
Reset(F);
repeat
Readln(F,s);
memo2.Lines.Add(s);
i:= i + 1;
until i = max;
CloseFile(F);
end;

end.

Alomejor falta algo pero ami me ha funcionado perfectamente.
Respecto a tu segunda respuesta de que el nombre o el nick aparece en la parte superior izquierda...Yo no lo veo en esta pantalla, asi que decidi de una forma sutil y bromista hacer contestar como lo hice (Y pido disculpas si lo he molestado) pero todavia y gracias a dios aun hay gente que trabaja y tiene ir posteando a casi escondidas.Espero que lo entienda. De todas formas si es tan importante que diga que cierre el posteo lo haré ya que el buen funcionamiento de esta pagina me interesa dada que es una de las mejores. saludo
Responder Con Cita
  #10  
Antiguo 12-06-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Varios comentarios a tu codigo

Cita:
Posteado originalmente por esquerda21
procedure TForm1.Button1Click(Sender: TObject);//Genera el array
var
i: integer;
begin
i:= 1;
repeat
SetLength(matriz1,i);
matriz1[i-1].x1:= i - 1;
matriz1[i-1].y1:= i + 1;
i:= i + 1;
until i = max;
end;
El SetLength solo hace falta hacerlo una vez, por lo que lo puedes quitar del repeat

Código:
procedure TForm1.Button1Click(Sender: TObject);//Genera el array
begin
  SetLength(matriz1,i);
  for i := 1 to max do
   begin
      matriz1[i-1].x1:= i - 1;
      matriz1[i-1].y1:= i + 1;
   end;
end;
Y, no crees que queda mas elegante el codigo (en este caso) con el uso de una sentencia repetitiva como FOR en lugar de REPEAT?

Cuando se utilizan contadores (como es el caso de tus REPEATS aqui), lo mas elegante y claro es utilizar bucles de tipo FOR (aparte de ahorrarnos algunas lineas de codigo )

Con respecto a la forma de grabar el fichero, puede que te interese abrirlo luego con un NotePad y ver su contenido (tal y como lo haces). Si no es el caso, graba la estructura directamente con el write

Código:
procedure TForm1.Button2Click(Sender: TObject);//Crea el archivo TXT
begin
   AssignFile(F, 'd:\delphi5\basura\pro.txt');
   Rewrite(F);
   for i := 1 to max do
     Write(F, matriz1[ i ]);
   CloseFile(F);
end;
y claro, declarando F no como un TextFile sino...

F: file of matriz;

como tienes en tu linea comentada

PD: como ya he dicho en otras ocasiones, no me gusta meterme donde no me llaman, pero, mientras escribes el mensaje, si te fijas, debajo del cuadro donde estas escribiendo (y por debajo de los botones de Submit Reply y Preview Reply, tienes TODO el hilo, con sus respuestas y autores de las mimas
Responder Con Cita
  #11  
Antiguo 12-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Disculpen el mal uso de los "quotes" en el anterior mensaje, este mensaje se lee mejor:

Esquerda21 escribió:
Cita:
Enefecto señorito andres1569, claro que lo he probado, Como todo lo que pregunto, pero disculpe mi ignorancia dado que no sabia que se debia contestar si me habia ido bien, ...
Puedes llamarme Andrés, simplemente. Disculpo tu ignorancia pero creía que contestar a quien trata de echarte una mano, lo haga mejor o peor, es parte de la buena educación. Si alguien responde a tu pregunta y no le contestas, se queda con la duda de si leiste su mensaje, si lo probaste, si te funcionó ... Aunque quien lo agradece es el conjunto del foro, así cuando alguien revisa ese hilo puede hacerse una idea de si la solución fue válida para poderla usar él también.

Cita:
Alomejor falta algo pero ami me ha funcionado perfectamente.
Respecto a tu segunda respuesta de que el nombre o el nick aparece en la parte superior izquierda...Yo no lo veo en esta pantalla, asi que decidi de una forma sutil y bromista hacer contestar como lo hice (Y pido disculpas si lo he molestado) ...
No lo cogí como una broma, sino que lo interpreté de mala forma. En general no me gustó el tono de tu mensaje, quizás esa expresión "y al señor este...Como se llama?", lo interpreté como si fuera de forma despectiva, más aún cuando la apreciación que hacía Lepe era oportuna. Una de las pegas de comunicarnos por escrito es que no vemos la cara del que está al otro lado, y no sabemos de qué forma nos dicen las cosas, si de broma, si en serio, si cabreados. Si estabas de broma, podías haber usado un smilie. Aunque en esto yo también debería haberte puesto un smilie (un smilie cabreado en mi caso, que es como estaba en aquel momento).

Pides disculpas si me has molestado. Yo TAMBIEN te pido disculpas si te malinterpretado, la verdad es que no me hace gracia tener que escribir mensajes como ése, prefiero darles un toque de humor.

Cita:
pero todavia y gracias a dios aun hay gente que trabaja y tiene ir posteando a casi escondidas.Espero que lo entienda.
Y también gracias a Dios hay gente que a parte de su trabajo ofrece su experiencia a otros para que su trabajo les resulte más llevadero. Te entiendo, pero un mensaje diciendo "Sí, me funcionó, era eso lo que buscaba" no conlleva mucho tiempo. Si miras en el foro, verás que es lo que se suele hacer.

Cita:
De todas formas si es tan importante que diga que cierre el posteo lo haré ya que el buen funcionamiento de esta pagina me interesa dada que es una de las mejores. saludo
Yo no soy quién (ni soy moderador ni nada) para decirte que tengas que cerrar todos los hilos que abras, hazlo como tú creas, mi opinión ya la sabes, eres libre para moverte por el foro como tu creas. Repito que no soy nadie para decirte cómo tienes que actuar y ahora me siento mal porque a lo mejor me he metido donde nadie me llamaba.

Bueno, me alegro de que se haya aclarado las cosas. Pillé un calentón porque no esperaba un mensaje así, y seguramente estuve demasiado duro contigo. Hasta te recordé ciertas faltas de ortografía, cosa que no hacía al caso (además, en estos foros lo "raro" es no cometerlas).

Sobre el código que ofreces, dos apreciaciones:

- El nombre de matriz no es el más adecuado para un registro, quizás lo podrías llamar TPunto, o algo así, aunque esto no tiene mayor importancia. Matriz es lo mismo que array, y alguien que tenga que trabajar con ese código puede confundirse.

- Ya que guardas los datos como cadenas de texto, entiendo que uses WriteLn, aunque hay una solución más rápida en Delphi para este caso, y es que utilices los métodos LoadFromFile y SaveToFile del objeto Lines del TMemo. Así te evitarías tener que recurrir al uso de AssignFile, Rewrite ... etc, propias del Pascal de toda la vida. De todas formas, el código que aquí te han ofrecido sirve para cuando quieras grabar en disco un array de cualquier tipo de datos que no sean cadenas:

Código:
Memo1.Lines.LoadFromFile('d:\delphi5\basura\pro.txt'); // Lee de un archivo

Memo1.Lines.SaveToFile('d:\delphi5\basura\pro.txt');  // Guarda en un archivo
Un cordial saludo
__________________
Guía de Estilo
Responder Con Cita
  #12  
Antiguo 13-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 22
esquerda21 Va por buen camino
Vale , por tu parte tu lo has expuesto y yo tambien. Lo dejamos en tablas.

nota: la democracia es doblegarse ante las opiniones de los demas de vez en cuando.

A¡¡¡ Me has hecho teclear mas con esta pequeña diferencia de opiniones que todos los posteos que he hecho. igual que ami me ha servido espero que ati tambien. Igualmente gracias por comopartir tu cosecha con gente como yo, con un campo de cultivo bastante pobre.Continua asi .GRACIAS
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:13:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi