PDA

Ver la Versión Completa : Tema: Ficheros de texto


Tonio
04-05-2003, 16:27:07
Ya no puedo buscar, es una pena.
Yo ando liado con ficheros de texto, bastante grandes.
Tengo una empanada con el tema de ficheros binarios, sin tipo, etc.
Yo quiero tener un archivo de texto en el que haya tres campos, el ejemplo típico de la agenda, uno numérico, uno string y otro string pero de muchos caracteres, mas de 130.000.
He copiado un ejemplo de un libro, creo de Charte, de una Agenda, lo compilo y funciona, pero...
Lo declaro así:

type
TRegistro = Record { Definición del registro a utilizar }
Id:integer
Libro: String[25];
Texto: AnsiString;

Pongo texto com ansistring, porque he leído que puede contener cualquier número de caracteres.

compilo y en esta línea Archivo: File Of TRegistro; // Para acceder al archivo

me dice:

[Error] Agenda.pas(34): Type 'TRegistro' needs finalization - not allowed in file type.

¿Qué debo hacer?, ¿Qué hago mal?.
Como hago para que en un fichero pueda poner 280 registros como el anterior, Id, Libro, Texto, que los pueda leer, modificar y guardar nuevamente.
Gracias de antemano.
Tonio.

kinobi
04-05-2003, 16:48:08
Hola,

Posteado originalmente por Tonio Pongo texto com ansistring, porque he leído que puede contener cualquier número de caracteres.

Puedes poner también String. Por defecto (salvo que lo hayas cambiado tú - directiva {$H-} y {$H+} ) un String es un AnsiString.

Posteado originalmente por Tonio [Error] Agenda.pas(34): Type 'TRegistro' needs finalization - not allowed in file type.

Te falta cerrar con "end;" la declaración del registro.

Posteado originalmente por Tonio Como hago para que en un fichero pueda poner 280 registros como el anterior, Id, Libro, Texto, que los pueda leer, modificar y guardar nuevamente.
Salvo que sea por puro interés de aprendizaje, lo mejor sería buscar otro tipo de almacenamiento, bases de datos y similares.

Saludos.

cadetill
04-05-2003, 16:51:42
he echo alguna prueba y, este error creo que te lo da porque hay que definir las longitudes (exactas) de cada campo

de echo, si lo declaras como "string" a secas, tambien salta este error.

podrias mirar de solucionarlo de la manera que te propongo a continuacion, a ver que te parece


type
LongText = array[1..500] of string[255];

TRegistro = record
id : integer;
libro : string[25];
texto : LongText;
end;

var Archivo: file of TRegistro;


o bien utilizando el TStringsList asi


type
TRegistro = record
id : integer;
libro : string[25];
texto : TStrings;
end;

var Archivo: file of TRegistro;


A ver si te sirve alguna de las 2 soluciones

marcoszorrilla
04-05-2003, 17:01:01
Me uno a lo dicho por el amigo Kinobi. Creo que deberías de utilizar Base de datos, aunque fuera Paradox.

Un Saludo.

kinobi
04-05-2003, 17:03:05
Hola,

Posteado originalmente por cadetill
[B]he echo alguna prueba y, este error creo que te lo da porque hay que definir las longitudes (exactas) de cada campo
Tienes razón a medias. El problema está al utilizar AnsiString (por defecto igual a un String). Los "archivos con tipo, o con declaración de registro" (typed files) no permiten las cadenas "grandes" (Ansi y Wide Strings) y deben utilizarse ShortStrings.

Posteado originalmente por cadetill de echo, si lo declaras como "string" a secas, tambien salta este error.
Por defecto, un String es un AnsiString, de ahí que salte el error.

Por cierto, no se tenga en cuenta mi mensaje anterior en este hilo, salvo lo referente al consejo sobre bases de datos.

Saludos.

Tonio
07-05-2003, 15:56:24
Gracias a todos por las respuestas, creo que me inclinaré por lo de las BD, no obstante haré pruebas.
Gracias nuevamente y un saludo.
Tonio.