FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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; 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; espero te sirva |
#3
|
||||
|
||||
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 |
#4
|
|||
|
|||
Hola:
Lo del Reset(F) sí que hay que ponerlo para leer información del archivo. Lepe ecribió: Cita:
__________________
Guía de Estilo |
#5
|
||||
|
||||
Gracias andres
|
#6
|
|||
|
|||
Cita:
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" |
#7
|
|||
|
|||
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 |
#8
|
|||
|
|||
Esquerda21 escribió:
Cita:
Cita:
Cita:
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 |
#9
|
|||
|
|||
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 |
#10
|
|||
|
|||
Varios comentarios a tu codigo
Cita:
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; 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; 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 |
#11
|
||||
|
||||
Disculpen el mal uso de los "quotes" en el anterior mensaje, este mensaje se lee mejor:
Esquerda21 escribió: Cita:
Cita:
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:
Cita:
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
__________________
Guía de Estilo |
#12
|
|||
|
|||
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 |
|
|
|