[ Foro de Pascal ]

fichero de tipo en pascal

11-Apr-2015 23:54
Saulo David Jorgez
13 Respuestas

Buenas tardes, estuve revisando de nuevo el curso de pascal la parte de los ficheros. Bueno un paréntesis, felicito al profesor  nacho por completar su curso de pascal. Seguimos adelante. Bueno el asunto es el siguiente, veo que tiene un fichero de datos y lo combina con un arreglo de datos, uno no trababa en lugar del otro, si no, ¿que función  cumple el arreglo dentro del fichero?

Lo otro es que el compilador me da un error de: Illegal counter variable el la lininea 39, o sea en la carga de datos. Anexo parte del código para que me puedan ayudar. Y gracias de antemano.


Uses
	crt;

type
	datos = record
		cedula: string[10];
		nombre: string[20];
		apells: string[20];
		edad: integer;
		sexo: char;
end;

function FileExists(basedatos: String): boolean;

Var
	fichero: file of datos;
	numdato: byte;
	datoActual: datos;
	Opcion: char;
	cantidad: integer;
	i: integer;
	continuar:char;

procedure CargarDatos;
	Begin
		assign(fichero, 'basedat.dat');
		reset(fichero);
		if FileExists('basedat.dat') then
			Begin
				cantidad := filesize(fichero);
				for i := 1 to cantidad do
				Read(fichero, datos(i));
				close(fichero);
			end
		else
			begin
				gotoxy(25,5); WriteLn('NO HABÍA FICHERO DE DATOS. SE CREARÁ.');
			end;
	end;


 


12-Apr-2015 00:34
Saulo David Jorgez

por cierto es el el for  to do que me da ese error y en el read tuve que cambiar [] por ()


12-Apr-2015 17:45
Nacho Cabanes (+83)

¿Qué versión de Pascal usas, para emplear paréntesis en vez de corchetes?

En cualquier caso, no entiendo por qué has creado una función FileExists que contiene otra Cargardatos y a su vez está llama a la primera... ¿recursividad indirecta? ¿No sobra la primera declaración?


13-Apr-2015 02:12
Luis Torres (+18)

En la parte que dice:


   read(fichero, datos(i));


¿Qué pretendes hacer con datos(i)?, ¿en qué parte del programa has definido datos(i)?

Saludos.


14-Apr-2015 05:35
Saulo David Jorgez

Por partes

Para Nacho

La versión de pascal es FreePacal 2.6.0

la función fileExists es pera comprobar si existe la base de datos, en mi ignorancia no se trata de cargar la base, cargo los datos para trabajar con ellos con reset

Para Luis

Supuestamente datos(i), datos es donde se guarda los record. i es el contador que me da error.

Repregunte par ambos

¿tengo que hacer un procedimiento de cargar datos o se puede habrir la base de datos en cada procedure para trabajar con ellos, o poedo llamar a este procedura para cargar los datos?

no se si me expliqué


14-Apr-2015 14:54
Luis Torres (+18)

Puedes trabajar de ambas formas, todo depende de lo que quieras hacer.

La línea que te da el error, ¿qué contiene? Me parece que no declaraste el arreglo para cargar los registros del fichero, sería algo como


datosRegistros: array[1..Max] of datos;


Saludos.


22-Apr-2015 23:56
Saulo David Jorgez

Buena tardes gracia por u ayuda ya resolví algunas cosas que no funcionaban en el programa. Pero tengo una pregunta relacionada con la base de datos. ¿Será posible importar y exportar datos de un archivo de texto a la base de datos y viceversa?


25-Apr-2015 10:15
Nacho Cabanes (+83)

Casi todo es posible si lo programas de forma adecuada.  ;-)

Sí, puedes hacer un programa auxiliar (o un procedimiento dentro de este programa) que tome datos de un fichero de texto y vuelque a tu fichero con tipo o viceversa. El fichero de texto deberá tener un formato bastante estricto, para que tu problema no tenga que pelear con muchos tipos de errores distintos, pero claro que se puede.


08-May-2015 23:29
Saulo David Jorgez

Pero como esta organizado internamente ese archivo de texto, ¿guarda los espacios de los campos?, ¿con qué caracter está separado?, ¿están seguidos unos de otros o cada registro por separado? Se podrá saber esto o hay que cargarlo, queda como sea y después se arregla. Gracias.


11-May-2015 03:43
Luis Torres (+18)

De cualquiera de las formas que has mencionado se puede construir el archivo de texto; pero, cuando te decidas por una en específico tendrás que respetarla e introducir todos los datos de esa misma manera. El programa o código que manejará (leerá o escribirá) ese archivo de texto debe estar diseñado de tal manera que pueda trabajar con él de acuerdo a esas normas. No es lo mismo un programa que maneje un archivo de texto en el que cada dato está puesto en una línea, a uno en el que un conjunto de datos estén separados por un caracter (como el '$') o por espacios en blancos, y un conjunto de datos estén separados del otro conjunto porque cada uno esté en una línea aparte, por ejemplo:

José 18 61
Pablo 23 70
Guillermo 19 73

para indicar Nombre, Edad y Peso.


Tienes que tener en consideración que si vas a guardar en una misma variable el Nombre y Apellido, sería mejor colocar cada dato en una línea aparte:

José
González
18
61
Pablo
Hernández
23
70
Guillermo
Linárez
19
73

En fin, cualquier forma que escojas será válida siempre y cuando no de lugar a confusión y el código de lectura y escritura esté hecho a la medida del archivo de texto.


Espero haberte orientado.


13-May-2015 23:46
Saulo David Jorgez

Esta clara tu respuesta, gracias. Otra pregunta sería: ¿qué tipo de base de datos puedo exportar para trabajar con pascal? es que el archivo que tengo que usar tiene mas de 2.000 registros. Sería mas fácil hacerlo convirtiendo con ¿....? access una base de datos o con cuál programa. o sería algo mas complicado.


16-May-2015 11:37
Nacho Cabanes (+83)

Casi cualquier base de datos te permitirá exportar a formatos genéricos de texto como el CSV (Comma Separated Values), que puedes analizar desde un programa en Pascal.

De igual modo, es fácil generar CSV desde tu programa si quieres analizar datos usando una hoja de cálculo o un gestor de bases de datos.


24-May-2015 00:41
Saulo David Jorgez

Gracias por tu respuesta muy buena,  lo hace copiar los datos de un CSV y convertirlo en una .DAT; pero el programa no lo leer muy bien. No se cual es el formato interno del DAT que forma Pascal, par poderlo pasar correctamente y el programa pueda aceptar los registros y los campos correctamente. Encontré un programa del profe que lee archivos, pero los volca exactamente como están en el de texto y el programa no los lee de esa forma. Al parecer lo voy que tener que hacer manualmente, o alguna forma que lea cada registro cada campo y los coloque en el archivo, exactamente como los leería pascal.

Pero tengo otro problema me sale un error al probar el programa, justo cuando van a grabar los datos:

An unhandled exception occurred at $004017f5 : EInOutError : File no assigned

Algunos dicen que es la unidad sysutils en conflicto con el sistema quien sabe que quiere decir eso, lo cierto que te dan un procedimiento para reasignar el error pero no me funcionó tampoco.

¿Podrán ayudarme en esto?


25-May-2015 13:54
Nacho Cabanes (+83)

Sin ver cómo guardas los datos, no sé qué problema hay. Para generar un CSV, deberías volcarlos como texto.

Normalmente, un error de tipo "File no assigned" es que falta la orden Assign que da nombre físico a un fichero lógico.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)