![]() |
file of, caracter de separación
hola a todos!
No se si es el lugar más adecuado, ya que ahora estoy programando en Pascal, pero supongo que muchos de vosotros habréis hecho pinitos (y más) con él. Estoy haciendo un programilla que debe guardar unos registros de un tipo determinado (tipoNuevo) en un fichero en disco. Creo un file of tipoNuevo, y al grabar o leer los registros me los graba / lee bien. El problema surge cuando edito el archivo como texto. Entre campo y campo de cada registro veo que me ha insertado un carácter variable (puede ser cualquiera). El asunto es que necesito quitar este caracter, pues las ristras que le dejo yo las usa otro programa que no espera encontrar nada ahí. He probado a escribir todo como un archivo de texto, pero el problema es que al permitir solo reset, rewrite, append no puedo acceder a la fila que yo quiero y modificarla. ¿Alguien me puede dar laguna pista? Muuuuuuuuuuchísimas gracias. Jon |
Como archivo de texto, si usas Rewrite te borrará el archivo, pero con Reset te puedes situar la principio, y despues con ReadLn puedes ir leyendo hasta situarte en la línea adecuada, para modificar, usas WriteLn.
Si usas un File of TRecord, no puedes modificar despues a mano el archivo, porque se crean las marcas de fin de registro, si lo modificas, despues al leer dará fallos. Saludos |
gracias Lepe,
es lo que he intentado, pero existe el siguiente problema. Si abro con reset el archivo es solo de lectura (ya que es de texto), por lo que aunque lea las líneas y me posiciones en la que yo quiero, a la hora de escribir tendré que hacer un rewrite, con lo que me borrará el archivo y me creará uno vacío. ¿Alguna ideas más? Muchas gracias, Jon |
Quizás fuera conveniente leer todo el archivo en memoria ¿es muy grande?
Si no lo es, 2000 o 3000 registros, puedes usar un TStringList y quitarte de todos esos problemas:
saludos |
muchas gracias lepe, pero (parezco el hombre de los peros) me temo que en turbo pascal no existe TStringList (o al menos yo no lo conozco). Lo único que se me ocurre es antes de escribir leer todo, añadir en el sitio adecuado la ristra que quiero y volver a escribir todo. Pero no me convence en absoluto.
Un saludo Jon |
porque no pruebas a bajar el FreePascal? si mal no recuerdo ya tiene la clase de TStrings o TStringList,
otra opcion seria que hicieras el guardado de registros a mano, pero guardandolos como texto delimitado por comas, y donde cada registro es un renglon por ejemplo "reg1campo1","reg1campo2","reg1Campo3","etc" "reg2campo1","reg2campo2","etc","etc" lo que si, es que es mas chamba, sin embargo, no dudo que haya por ahi una unidad ya hecha para leer y guardar datos en este formato... |
gracis luisgutierrezb.
El free pascal ya lo tengo bajado, pero el problema es que el programilla que estoy haciendo yo lo tengo que importar a un proyecto bastante grande que está hecho en turbo pascal 7.0. Este proyecto he intentado pasarlo a free pascal, pero es más trabajo que matar una burra a pellizcos. por eso desistí. Lo de los campos separados con comas tampoco me sirve, ya que tengo que dejar un fichero solo con los datos que yo le paso, pero sin comas ni nada. Si el registro es Código:
tRegistro = record Código:
nnnnnnnnnnnnnnnaaaaaaaaaaaaaaaaaaaaaaaaaaattttttttt Muchas gracias a los que estáis mostrando tanto interés. Un saludo Jon |
Pues se acabó lo que se daba, esto tiene que funcionar en Turbo pascal, ya que usa las funcionies de bajo nivel del sistema operativo.
Edito: Las funciones las pillo de SysUtils, pero estarán en otra unidad de Turbo Pascal. THandle es un Entero largo. Espero que sea viable ;). SAludos |
muchas gracias lepe, pero.... me pasa solo a mi o en el archivo que crea escribe
Código:
texto 18@ texto 28@ texto 38@ Precisamente son los "cuadraditos", las arrobas y demás signos los que quiero evitar. No sé, estoy liado. Un saludo y muchas grcias Jon |
Hola Jonmendi,
No sé si me he perdido un poco con el tema, pero creo que lo estais complicando demasiado. Lo que tu necesitas es un fichero de texto, no de un tipo concreto, de esa forma te pondrá los datos que necesitas uno tras otro, sin separadores de campo. Únicamente tendrá el caracter de fin de registro, lo cual no te dará ningún tipo de problema con la otra aplicación que debe leer ese fichero. Con lo que sí tienes que tener cuidado es con completar el tamaño de los campos, ya que al no ir separados por nada tienen que tener su longitud exacta. Me explico con un ejemplo hecho de cabeza: Código:
var MiNombre, MiApellido, MiTelefono, LoQueGrabo, Espacios : String; Saludos |
muchas gracias rafita!
si yo tb opino que me estoy liando, pero.... que no encuentro solución! El código que me envías lo tengo probado, pero hay un problemilla: cuando abres un fichero de texto con reset(F), no puedes escribir en el mismo, solo leer. Si lo abro con rewrite(F) me borra todo lo que haya, cosa que tampoco me interesa (por distintos motivos de permisos etc etc...), y el append no me sirve porque yo quiero modificar una línea en concreto. Por eso creo que no puedo usar un archivo de texto. En basic se que había un put y get que hacian lo que yo quiero, pero en turbo pascal .... pues que no me sale! Muchas gracias a todos. Y ya es jueves, así que animo. Jon |
Hola Jon,
Vayamos por partes. No recuerdo exactamente las características de los ficheros de texto en pascal, pero creo que tienes toda la razón: no permite modificar, tan solo abrir para leer y para escribir (borrando lo que tuviese). Sin embargo en los ficheros "con tipo" sí permitía acceder directamente a un registro y modificarlo. Al leer tu primer mensaje de este hilo entendí que tú generabas el fichero, y que el problema era que fuese compatible con otra aplicación. Luego bastaba con generarlo correctamente (para no tener que modificar después ninguna lína), por eso te comente lo de los ficheros de texto. Si en tu aplicación vas a tener que acceder a un registro concreto y modificarlo, se me ocurren varias posibilidades: 1ª) trabaja con un fichero "con tipo" (si puedes, mejor con una base de datos), y cuando necesites el fichero para comunicarte con la otra aplicación, lo generas como tipo texto. 2ª) prueba a trabajar con un fichero "con tipo", pero agrupando todos los campos en uno sólo (respetando las longitudes para poder codificarlo y decodificarlo), quizá así la otra aplicación no rechace el caracter de fin de campo. 3ª) si la modificación en un registro/línea va a ser algo puntual, puedes generarte el fichero de tipo texto y modificarlo "a mano" con cualquier editor de texto. 4ª) (trabajando con Delphi) si la modificación de los registros va a ser habitual, podrías generar el fichero de texto y utilizar (mediante Delphi) las posibilidades de reemplazar texto que te dan algunos procesadores de texto como Word (mira el apartado Server de este foro). 5ª) finalmente, puedes trabajar a lo bestia. Es decir, tienes tu fichero de texto (abierto con reset) que vas pasando a otro de trabajo (abierto con rewrite), cuando llegues a la línea a modificar, la cambias, y continuas procesando el fichero hasta llegar a final. Después les cambias los nombres o vuelves a pasar el contenido del fichero de trabajo al original. Esto es trabajar a lo bestia pero lo hace la máquina, y con los procesadores de hoy en día... tampoco será tanto tiempo. Saludos Jon (y ánimo que ya es viernes) |
muchas gracias rafita!
me parece que al final la solución me paece que va a ser algo parecido a la opción 5. Muchas gracias a todos los que habéis demostrado interés. Un slaudo, y no os derritais. Jon |
La franja horaria es GMT +2. Ahora son las 07:01:18. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi