PDA

Ver la Versión Completa : Como gravar un array en disco


esquerda21
09-06-2003, 09:55:17
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

__cadetill
09-06-2003, 16:32:41
si el array es de un tipo definido por ti, tienes que declarar la variable de ese tipo, es decir


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


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

Lepe
09-06-2003, 19:02:28
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

andres1569
09-06-2003, 19:16:41
Hola:

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

Lepe ecribió:
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.

Lepe
09-06-2003, 19:39:30
Gracias andres ;)

__cadetill
10-06-2003, 13:30:43
Posteado originalmente por andres1569
Lepe ecribió:

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"

esquerda21
11-06-2003, 09:29:23
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

andres1569
11-06-2003, 10:45:30
Esquerda21 escribió:
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?

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!

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 (http://www.clubdelphi.com/users/llsoft/Docs/GuiaEstilo.php), 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).

esquerda21
12-06-2003, 09:42:41
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

__cadetill
12-06-2003, 12:59:32
Varios comentarios a tu codigo

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


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 :p)

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


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

andres1569
12-06-2003, 14:33:51
Disculpen el mal uso de los "quotes" en el anterior mensaje, este mensaje se lee mejor:

Esquerda21 escribió:
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.

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.

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.

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:


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

esquerda21
13-06-2003, 14:23:20
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